diff options
author | Sean Callanan <scallanan@apple.com> | 2016-11-07 20:42:25 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2016-11-07 20:42:25 +0000 |
commit | 2d91c3ae7263449c2f49a4217187a5cf7ff35d55 (patch) | |
tree | fd4cd2d2dbf7b6d0d66071cb67494e853a468a4c /lib/AST/ASTImporter.cpp | |
parent | 777d844d0f09ca78023557ac0c8318d6061c4188 (diff) | |
download | clang-2d91c3ae7263449c2f49a4217187a5cf7ff35d55.tar.gz |
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
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@286144 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ASTImporter.cpp')
-rw-r--r-- | lib/AST/ASTImporter.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
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<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); SourceManager &ToSM = ToContext.getSourceManager(); FileID ToFileID = Import(Decomposed.first); |