зеркало из https://github.com/microsoft/clang.git
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:
Родитель
8a9013d248
Коммит
87a1e19735
|
@ -2398,6 +2398,21 @@ LexNextToken:
|
|||
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 == '%') { // '<%' -> '{'
|
||||
|
|
|
@ -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}}
|
Загрузка…
Ссылка в новой задаче