Implement C++0x [lex.pptoken]p3's handling of <::.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129525 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Richard Smith 2011-04-14 18:36:27 +00:00
Родитель 8a9013d248
Коммит 87a1e19735
2 изменённых файлов: 26 добавлений и 0 удалений

Просмотреть файл

@ -2398,6 +2398,21 @@ LexNextToken:
CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
Kind = tok::lessequal; Kind = tok::lessequal;
} else if (Features.Digraphs && Char == ':') { // '<:' -> '[' } 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); CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
Kind = tok::l_square; Kind = tok::l_square;
} else if (Features.Digraphs && Char == '%') { // '<%' -> '{' } else if (Features.Digraphs && Char == '%') { // '<%' -> '{'

Просмотреть файл

@ -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}}