Use expansion location when looking for the location of a decl that comes from a macro invocation PiperOrigin-RevId: 425691134
diff --git a/rs_bindings_from_cc/importer.cc b/rs_bindings_from_cc/importer.cc index b7e02f5..5c3e473 100644 --- a/rs_bindings_from_cc/importer.cc +++ b/rs_bindings_from_cc/importer.cc
@@ -453,7 +453,6 @@ BlazeLabel Importer::GetOwningTarget(const clang::Decl* decl) const { clang::SourceManager& source_manager = ctx_.getSourceManager(); auto source_location = decl->getLocation(); - auto id = source_manager.getFileID(source_location); // If the header this decl comes from is not associated with a target we // consider it a textual header. In that case we go up the include stack @@ -464,6 +463,10 @@ // "//:virtual_clang_resource_dir_target" for system headers. while (source_location.isValid() && !source_manager.isInSystemHeader(source_location)) { + if (source_location.isMacroID()) { + source_location = source_manager.getExpansionLoc(source_location); + } + auto id = source_manager.getFileID(source_location); llvm::Optional<llvm::StringRef> filename = source_manager.getNonBuiltinFilenameForID(id); if (!filename) { @@ -477,7 +480,6 @@ return *target; } source_location = source_manager.getIncludeLoc(id); - id = source_manager.getFileID(source_location); } return BlazeLabel("//:virtual_clang_resource_dir_target");
diff --git a/rs_bindings_from_cc/test/macro_locations/defines_macro.h b/rs_bindings_from_cc/test/macro_locations/defines_macro.h new file mode 100644 index 0000000..3744dc0 --- /dev/null +++ b/rs_bindings_from_cc/test/macro_locations/defines_macro.h
@@ -0,0 +1,13 @@ +// Part of the Crubit project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_DEFINES_MACRO_H_ +#define CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_DEFINES_MACRO_H_ + +#define DEFINE_STRUCT(type) \ + struct StructFromMacro { \ + type val; \ + }; + +#endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_DEFINES_MACRO_H_
diff --git a/rs_bindings_from_cc/test/macro_locations/defines_macro_that_uses_macro.h b/rs_bindings_from_cc/test/macro_locations/defines_macro_that_uses_macro.h new file mode 100644 index 0000000..8105511 --- /dev/null +++ b/rs_bindings_from_cc/test/macro_locations/defines_macro_that_uses_macro.h
@@ -0,0 +1,14 @@ +// Part of the Crubit project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_DEFINES_MACRO_THAT_USES_MACRO_H_ +#define CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_DEFINES_MACRO_THAT_USES_MACRO_H_ + +#include "rs_bindings_from_cc/test/macro_locations/defines_macro.h" + +#define DEFINE_STRUCT_AND_FUNCTION(type) \ + DEFINE_STRUCT(type) \ + inline type functionFromMacro(type x) { return x; } + +#endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_DEFINES_MACRO_THAT_USES_MACRO_H_
diff --git a/rs_bindings_from_cc/test/macro_locations/uses_macro.h b/rs_bindings_from_cc/test/macro_locations/uses_macro.h new file mode 100644 index 0000000..58a24de --- /dev/null +++ b/rs_bindings_from_cc/test/macro_locations/uses_macro.h
@@ -0,0 +1,12 @@ +// Part of the Crubit project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_USES_MACRO_H_ +#define CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_USES_MACRO_H_ + +#include "rs_bindings_from_cc/test/macro_locations/defines_macro_that_uses_macro.h" + +DEFINE_STRUCT_AND_FUNCTION(int) + +#endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_MACRO_LOCATIONS_USES_MACRO_H_
diff --git a/rs_bindings_from_cc/test/macro_locations/uses_struct_and_function_from_macro.rs b/rs_bindings_from_cc/test/macro_locations/uses_struct_and_function_from_macro.rs new file mode 100644 index 0000000..bdf3d7a --- /dev/null +++ b/rs_bindings_from_cc/test/macro_locations/uses_struct_and_function_from_macro.rs
@@ -0,0 +1,13 @@ +// Part of the Crubit project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#[cfg(test)] +mod tests { + + #[test] + fn test_uses_struct_and_function_from_macro() { + let my_struct = uses_macro::StructFromMacro { val: 3 }; + assert_eq!(my_struct.val, uses_macro::functionFromMacro(3)); + } +}