]> granicus.if.org Git - clang/commitdiff
When the ASTImporter imports a source location, it avoids importing macro
authorSean Callanan <scallanan@apple.com>
Mon, 7 Nov 2016 20:42:25 +0000 (20:42 +0000)
committerSean Callanan <scallanan@apple.com>
Mon, 7 Nov 2016 20:42:25 +0000 (20:42 +0000)
expansions by calling getSpellingLoc(). That's great in most cases, but for
macros defined in the '<built-in>' 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

lib/AST/ASTImporter.cpp
test/ASTMerge/Inputs/macro.modulemap [new file with mode: 0644]
test/ASTMerge/Inputs/macro1.h [new file with mode: 0644]
test/ASTMerge/Inputs/macro1.m [new file with mode: 0644]
test/ASTMerge/Inputs/macro2.m [new file with mode: 0644]
test/ASTMerge/macro.m [new file with mode: 0644]

index 9e17c0c3de58d2a177fb24cf00323c82d48a5e3b..e783854448bbae76776fe4a0cc1253729986c262 100644 (file)
@@ -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<FileID, unsigned> 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 (file)
index 0000000..dba1f22
--- /dev/null
@@ -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 (file)
index 0000000..f089e61
--- /dev/null
@@ -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 (file)
index 0000000..2612613
--- /dev/null
@@ -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 (file)
index 0000000..b5b155a
--- /dev/null
@@ -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 (file)
index 0000000..77e596d
--- /dev/null
@@ -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