aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Lex/Lexer.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-04-14 18:36:27 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-04-14 18:36:27 +0000
commitf7b6202e6c4ee09a842b2365ab38a33ce6acf235 (patch)
tree123bcc0ab2443fdb7f6aef062deeb9e63972553f /clang/lib/Lex/Lexer.cpp
parenta519284fecb61e882b02c5ee7e3f06daa0ba4ffd (diff)
downloadllvm-f7b6202e6c4ee09a842b2365ab38a33ce6acf235.zip
llvm-f7b6202e6c4ee09a842b2365ab38a33ce6acf235.tar.gz
llvm-f7b6202e6c4ee09a842b2365ab38a33ce6acf235.tar.bz2
Implement C++0x [lex.pptoken]p3's handling of <::.
llvm-svn: 129525
Diffstat (limited to 'clang/lib/Lex/Lexer.cpp')
-rw-r--r--clang/lib/Lex/Lexer.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index ea2a2de..466f61e 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -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 == '%') { // '<%' -> '{'