Really support `decltype(auto)` (e.g. in function return types).

PiperOrigin-RevId: 449289704
diff --git a/rs_bindings_from_cc/importer.cc b/rs_bindings_from_cc/importer.cc
index 3c27643..ff988e1 100644
--- a/rs_bindings_from_cc/importer.cc
+++ b/rs_bindings_from_cc/importer.cc
@@ -718,6 +718,11 @@
   } else if (const auto* subst_type =
                  type->getAs<clang::SubstTemplateTypeParmType>()) {
     return ConvertQualType(subst_type->getReplacementType(), lifetimes);
+  } else if (const auto* deduced_type = type->getAs<clang::DeducedType>()) {
+    // Deduction should have taken place earlier (e.g. via DeduceReturnType
+    // called from FunctionDeclImporter::Import).
+    CRUBIT_CHECK(deduced_type->isDeduced());
+    return ConvertQualType(deduced_type->getDeducedType(), lifetimes);
   }
 
   return absl::UnimplementedError(absl::StrCat(
diff --git a/rs_bindings_from_cc/importers/BUILD b/rs_bindings_from_cc/importers/BUILD
index 7391473..60a2dac 100644
--- a/rs_bindings_from_cc/importers/BUILD
+++ b/rs_bindings_from_cc/importers/BUILD
@@ -44,6 +44,7 @@
         "@absl//strings",
         "//rs_bindings_from_cc:ast_util",
         "//rs_bindings_from_cc:decl_importer",
+        "@llvm///clang:sema",
     ],
 )
 
diff --git a/rs_bindings_from_cc/importers/function.cc b/rs_bindings_from_cc/importers/function.cc
index 1f1e363..848d04e 100644
--- a/rs_bindings_from_cc/importers/function.cc
+++ b/rs_bindings_from_cc/importers/function.cc
@@ -6,6 +6,7 @@
 
 #include "absl/strings/substitute.h"
 #include "rs_bindings_from_cc/ast_util.h"
+#include "clang/Sema/Sema.h"
 
 namespace crubit {
 
@@ -90,6 +91,14 @@
     params.push_back({*param_type, *std::move(param_name)});
   }
 
+  if (function_decl->getReturnType()->isUndeducedType()) {
+    bool still_undeduced = ictx_.sema_.DeduceReturnType(
+        function_decl, function_decl->getLocation());
+    if (still_undeduced) {
+      add_error("Couldn't deduce the return type");
+    }
+  }
+
   if (const clang::RecordType* record_return_type =
           clang::dyn_cast<clang::RecordType>(function_decl->getReturnType())) {
     if (clang::RecordDecl* record_decl =
diff --git a/rs_bindings_from_cc/ir_from_cc_test.rs b/rs_bindings_from_cc/ir_from_cc_test.rs
index 0898e09..8fd705d 100644
--- a/rs_bindings_from_cc/ir_from_cc_test.rs
+++ b/rs_bindings_from_cc/ir_from_cc_test.rs
@@ -1131,6 +1131,7 @@
     Ok(())
 }
 
+#[test]
 fn test_template_with_decltype_and_with_auto() -> Result<()> {
     let ir = ir_from_cc(
         r#" #pragma clang lifetime_elision