[cfe-commits] r129525 - in /cfe/trunk: lib/Lex/Lexer.cpp test/CXX/lex/lex.pptoken/p3-0x.cpp
Richard Smith
richard-llvm at metafoo.co.uk
Thu Apr 14 11:36:27 PDT 2011
Author: rsmith
Date: Thu Apr 14 13:36:27 2011
New Revision: 129525
URL: http://llvm.org/viewvc/llvm-project?rev=129525&view=rev
Log:
Implement C++0x [lex.pptoken]p3's handling of <::.
Added:
cfe/trunk/test/CXX/lex/lex.pptoken/p3-0x.cpp
Modified:
cfe/trunk/lib/Lex/Lexer.cpp
Modified: cfe/trunk/lib/Lex/Lexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=129525&r1=129524&r2=129525&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/Lexer.cpp (original)
+++ cfe/trunk/lib/Lex/Lexer.cpp Thu Apr 14 13:36:27 2011
@@ -2398,6 +2398,21 @@
CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
Kind = tok::lessequal;
} else if (Features.Digraphs && Char == ':') { // '<:' -> '['
+ if (Features.CPlusPlus0x &&
+ getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == ':') {
+ // C++0x [lex.pptoken]p3:
+ // Otherwise, if the next three characters are <:: and the subsequent
+ // character is neither : nor >, the < is treated as a preprocessor
+ // token by itself and not as the first character of the alternative
+ // token <:.
+ unsigned SizeTmp3;
+ char After = getCharAndSize(CurPtr + SizeTmp + SizeTmp2, SizeTmp3);
+ if (After != ':' && After != '>') {
+ Kind = tok::less;
+ break;
+ }
+ }
+
CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
Kind = tok::l_square;
} else if (Features.Digraphs && Char == '%') { // '<%' -> '{'
Added: cfe/trunk/test/CXX/lex/lex.pptoken/p3-0x.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/lex/lex.pptoken/p3-0x.cpp?rev=129525&view=auto
==============================================================================
--- cfe/trunk/test/CXX/lex/lex.pptoken/p3-0x.cpp (added)
+++ cfe/trunk/test/CXX/lex/lex.pptoken/p3-0x.cpp Thu Apr 14 13:36:27 2011
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++0x -verify %s
+
+int a<::> = { 1, 2, 3 };
+int b = a<:::a<:0:>:>;
+bool c = a<:0:><::b;
+
+template<int &n> void f() {}
+template void f<::b>();
+
+#define x a<:: ## : b :>
+int d = x; // expected-error {{pasting formed ':::', an invalid preprocessing token}} expected-error {{expected unqualified-id}}
More information about the cfe-commits
mailing list