diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-12-19 23:55:44 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-12-19 23:55:44 +0000 |
commit | 5e14925a35e87b46d48e6dc6b71a682956c50d55 (patch) | |
tree | 8b5b682f12cb352aad1ac9c9f06f32f6ac5244d3 /clang | |
parent | 6ad6c3b1c24eaca15d56d9a5b4d3ba810a743e33 (diff) | |
download | bcm5719-llvm-5e14925a35e87b46d48e6dc6b71a682956c50d55.tar.gz bcm5719-llvm-5e14925a35e87b46d48e6dc6b71a682956c50d55.zip |
[preprocessor] When "merging" macro argument tokens into one SLocEntry chunk,
make sure they came from the same kind of FileIDs.
Thanks to Abramo Bagnara for providing the test case.
llvm-svn: 170616
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Lex/TokenLexer.cpp | 8 | ||||
-rw-r--r-- | clang/test/Preprocessor/macro_arg_slocentry_merge.c | 7 | ||||
-rw-r--r-- | clang/test/Preprocessor/macro_arg_slocentry_merge.h | 7 |
3 files changed, 20 insertions, 2 deletions
diff --git a/clang/lib/Lex/TokenLexer.cpp b/clang/lib/Lex/TokenLexer.cpp index 8c6f6204eb8..5b41fe9b8d3 100644 --- a/clang/lib/Lex/TokenLexer.cpp +++ b/clang/lib/Lex/TokenLexer.cpp @@ -749,14 +749,18 @@ static void updateConsecutiveMacroArgTokens(SourceManager &SM, Token *NextTok = begin_tokens + 1; for (; NextTok < end_tokens; ++NextTok) { + SourceLocation NextLoc = NextTok->getLocation(); + if (CurLoc.isFileID() != NextLoc.isFileID()) + break; // Token from different kind of FileID. + int RelOffs; - if (!SM.isInSameSLocAddrSpace(CurLoc, NextTok->getLocation(), &RelOffs)) + if (!SM.isInSameSLocAddrSpace(CurLoc, NextLoc, &RelOffs)) break; // Token from different local/loaded location. // Check that token is not before the previous token or more than 50 // "characters" away. if (RelOffs < 0 || RelOffs > 50) break; - CurLoc = NextTok->getLocation(); + CurLoc = NextLoc; } // For the consecutive tokens, find the length of the SLocEntry to contain diff --git a/clang/test/Preprocessor/macro_arg_slocentry_merge.c b/clang/test/Preprocessor/macro_arg_slocentry_merge.c new file mode 100644 index 00000000000..9ab385f8084 --- /dev/null +++ b/clang/test/Preprocessor/macro_arg_slocentry_merge.c @@ -0,0 +1,7 @@ +// RUN: not %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s + +#include "macro_arg_slocentry_merge.h" + +// CHECK: macro_arg_slocentry_merge.h:7:19: error: unknown type name 'win' +// CHECK: macro_arg_slocentry_merge.h:5:16: note: expanded from macro 'WINDOW' +// CHECK: macro_arg_slocentry_merge.h:6:18: note: expanded from macro 'P_' diff --git a/clang/test/Preprocessor/macro_arg_slocentry_merge.h b/clang/test/Preprocessor/macro_arg_slocentry_merge.h new file mode 100644 index 00000000000..62595b762e5 --- /dev/null +++ b/clang/test/Preprocessor/macro_arg_slocentry_merge.h @@ -0,0 +1,7 @@ + + + + +#define WINDOW win +#define P_(args) args +extern void f P_((WINDOW win)); |