summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-12-19 23:55:44 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-12-19 23:55:44 +0000
commit5e14925a35e87b46d48e6dc6b71a682956c50d55 (patch)
tree8b5b682f12cb352aad1ac9c9f06f32f6ac5244d3 /clang
parent6ad6c3b1c24eaca15d56d9a5b4d3ba810a743e33 (diff)
downloadbcm5719-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.cpp8
-rw-r--r--clang/test/Preprocessor/macro_arg_slocentry_merge.c7
-rw-r--r--clang/test/Preprocessor/macro_arg_slocentry_merge.h7
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));
OpenPOWER on IntegriCloud