From a69d0ed3ab66e96393586664a103e9482ec59e6f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 10 Dec 2009 02:02:58 +0000 Subject: [PATCH] fix a more evil case of : / :: confusion arising in ?:. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91039 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseExpr.cpp | 3 +++ test/Parser/cxx-decl.cpp | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 54131e0ccc..2536cee1cb 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -317,6 +317,9 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) { OwningExprResult TernaryMiddle(Actions, true); if (NextTokPrec == prec::Conditional) { if (Tok.isNot(tok::colon)) { + // Don't parse FOO:BAR as if it were a typo for FOO::BAR. + ColonProtectionRAIIObject X(*this); + // Handle this production specially: // logical-OR-expression '?' expression ':' conditional-expression // In particular, the RHS of the '?' is 'expression', not diff --git a/test/Parser/cxx-decl.cpp b/test/Parser/cxx-decl.cpp index 4453c4c3d0..38467117b3 100644 --- a/test/Parser/cxx-decl.cpp +++ b/test/Parser/cxx-decl.cpp @@ -2,7 +2,9 @@ int x(*g); // expected-error {{use of undeclared identifier 'g'}} -struct Type { }; +struct Type { + int Type; +}; // PR4451 - We should recover well from the typo of '::' as ':' in a2. @@ -40,3 +42,7 @@ struct a { int Type : fooenum; }; +void test(struct Type *P) { + int Type; + Type = 1 ? P->Type : Type; +} \ No newline at end of file -- 2.50.1