summaryrefslogtreecommitdiffstats
path: root/clang/test/Preprocessor/_Pragma-in-macro-arg.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2019-04-11 21:18:22 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2019-04-11 21:18:22 +0000
commit75f9681874252ac96db002a80df4202ec2cdd2f8 (patch)
treef5f585fac34b89251395afacd92b5f94bd338f71 /clang/test/Preprocessor/_Pragma-in-macro-arg.cpp
parent6ffa1511eaedfae67ea4c66c2264b46eaccbbd7d (diff)
downloadbcm5719-llvm-75f9681874252ac96db002a80df4202ec2cdd2f8.tar.gz
bcm5719-llvm-75f9681874252ac96db002a80df4202ec2cdd2f8.zip
Remove use of lookahead from _Pragma handling and from all other
internal lexing steps in the preprocessor. It is not safe to use the preprocessor's token lookahead except when operating on the final sequence of tokens that would be produced by phase 4 of translation. Doing so corrupts the token lookahead cache used by the parser. (See added testcase for an example.) Lookahead should instead be viewed as a layer on top of the normal lexer. Added assertions to catch any further incorrect uses of lookahead within lexing actions. llvm-svn: 358230
Diffstat (limited to 'clang/test/Preprocessor/_Pragma-in-macro-arg.cpp')
-rw-r--r--clang/test/Preprocessor/_Pragma-in-macro-arg.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/test/Preprocessor/_Pragma-in-macro-arg.cpp b/clang/test/Preprocessor/_Pragma-in-macro-arg.cpp
new file mode 100644
index 00000000000..0d2dcd05124
--- /dev/null
+++ b/clang/test/Preprocessor/_Pragma-in-macro-arg.cpp
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 %s -verify -Wconversion
+
+#define P(X) _Pragma(#X)
+#define V(X) X
+
+#define X \
+ P(clang diagnostic push) \
+ P(clang diagnostic ignored "-Wconversion") \
+ ) = 1.2; \
+ P(clang diagnostic pop)
+
+void f() {
+ int a = 1.2; // expected-warning {{changes value}}
+
+ // Note, we intentionally enter a tentatively-parsed context here to trigger
+ // regular use of lookahead. This would go wrong if _Pragma checking in macro
+ // argument pre-expansion also tries to use token lookahead.
+ int (b
+ V(X)
+
+ int c = 1.2; // expected-warning {{changes value}}
+}
OpenPOWER on IntegriCloud