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 '<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

llvm-svn: 286144
This commit is contained in:
Sean Callanan 2016-11-07 20:42:25 +00:00
parent 5caae908b7
commit 24c5fe6b34
6 changed files with 27 additions and 2 deletions

View 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);

View File

@ -0,0 +1,4 @@
module macro1 [extern_c] {
header "macro1.h"
export *
}

View File

@ -0,0 +1,5 @@
typedef void *VoidRef;
void maybeNull(
int i,
__nullable VoidRef *__nullable);

View File

@ -0,0 +1,5 @@
@import macro1;
void foo() {
maybeNull(0, 0);
}

View File

@ -0,0 +1,5 @@
void foo();
void bar() {
foo();
}

View File

@ -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