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