From: Sean Callanan Date: Mon, 7 Nov 2016 20:42:25 +0000 (+0000) Subject: When the ASTImporter imports a source location, it avoids importing macro X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d91c3ae7263449c2f49a4217187a5cf7ff35d55;p=clang When the ASTImporter imports a source location, it avoids importing macro expansions by calling getSpellingLoc(). That's great in most cases, but for macros defined in the '' source file, the source file is invalid and does not import correctly, causing an assertion failure (the assertion is Invalid SLocOffset or bad function choice). A more reliable way to avoid this is to use getFileLoc(), which does not return built-in locations. This avoids the crash but still preserves valid source locations. I've added a testcase that covers the previously crashing scenario. https://reviews.llvm.org/D26054 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@286144 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index 9e17c0c3de..e783854448 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -6943,10 +6943,10 @@ SourceLocation ASTImporter::Import(SourceLocation FromLoc) { SourceManager &FromSM = FromContext.getSourceManager(); - // For now, map everything down to its spelling location, so that we + // For now, map everything down to its file location, so that we // don't have to import macro expansions. // FIXME: Import macro expansions! - FromLoc = FromSM.getSpellingLoc(FromLoc); + FromLoc = FromSM.getFileLoc(FromLoc); std::pair Decomposed = FromSM.getDecomposedLoc(FromLoc); SourceManager &ToSM = ToContext.getSourceManager(); FileID ToFileID = Import(Decomposed.first); diff --git a/test/ASTMerge/Inputs/macro.modulemap b/test/ASTMerge/Inputs/macro.modulemap new file mode 100644 index 0000000000..dba1f2207f --- /dev/null +++ b/test/ASTMerge/Inputs/macro.modulemap @@ -0,0 +1,4 @@ +module macro1 [extern_c] { + header "macro1.h" + export * +} diff --git a/test/ASTMerge/Inputs/macro1.h b/test/ASTMerge/Inputs/macro1.h new file mode 100644 index 0000000000..f089e61254 --- /dev/null +++ b/test/ASTMerge/Inputs/macro1.h @@ -0,0 +1,5 @@ +typedef void *VoidRef; + +void maybeNull( + int i, + __nullable VoidRef *__nullable); diff --git a/test/ASTMerge/Inputs/macro1.m b/test/ASTMerge/Inputs/macro1.m new file mode 100644 index 0000000000..2612613bd0 --- /dev/null +++ b/test/ASTMerge/Inputs/macro1.m @@ -0,0 +1,5 @@ +@import macro1; + +void foo() { + maybeNull(0, 0); +} diff --git a/test/ASTMerge/Inputs/macro2.m b/test/ASTMerge/Inputs/macro2.m new file mode 100644 index 0000000000..b5b155a95b --- /dev/null +++ b/test/ASTMerge/Inputs/macro2.m @@ -0,0 +1,5 @@ +void foo(); + +void bar() { + foo(); +} diff --git a/test/ASTMerge/macro.m b/test/ASTMerge/macro.m new file mode 100644 index 0000000000..77e596d3ba --- /dev/null +++ b/test/ASTMerge/macro.m @@ -0,0 +1,6 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t/cache +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache -fmodule-map-file=%S/Inputs/macro.modulemap -I%S/Inputs -emit-pch -o %t.1.ast %S/Inputs/macro1.m +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache -fmodule-map-file=%S/Inputs/macro.modulemap -I%S/Inputs -emit-pch -o %t.2.ast %S/Inputs/macro2.m +// RUN: %clang_cc1 -fmodules -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only -verify %s +// expected-no-diagnostics