If we enter parens, colons can become un-sacred, allowing us to emit

a better diagnostic in the second example.

llvm-svn: 91040
This commit is contained in:
Chris Lattner 2009-12-10 02:08:07 +00:00
parent 244b96ba0a
commit 3c674cf804
3 changed files with 19 additions and 6 deletions

View File

@ -565,9 +565,15 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
TypeTy *CastTy;
SourceLocation LParenLoc = Tok.getLocation();
SourceLocation RParenLoc;
Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
TypeOfCast, CastTy, RParenLoc);
if (Res.isInvalid()) return move(Res);
{
// The inside of the parens don't need to be a colon protected scope.
ColonProtectionRAIIObject X(*this, false);
Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
TypeOfCast, CastTy, RParenLoc);
if (Res.isInvalid()) return move(Res);
}
switch (ParenExprType) {
case SimpleExpr: break; // Nothing else to do.

View File

@ -48,8 +48,9 @@ namespace clang {
Parser &P;
bool OldVal;
public:
ColonProtectionRAIIObject(Parser &p) : P(p), OldVal(P.ColonIsSacred) {
P.ColonIsSacred = true;
ColonProtectionRAIIObject(Parser &p, bool Value = true)
: P(p), OldVal(P.ColonIsSacred) {
P.ColonIsSacred = Value;
}
/// restore - This can be used to restore the state early, before the dtor

View File

@ -9,7 +9,8 @@ struct Type {
// PR4451 - We should recover well from the typo of '::' as ':' in a2.
namespace y {
struct a { };
struct a { };
typedef int b;
}
y::a a1;
@ -45,4 +46,9 @@ struct a {
void test(struct Type *P) {
int Type;
Type = 1 ? P->Type : Type;
Type = (y:b) 4; // expected-error {{unexpected ':' in nested name specifier}}
Type = 1 ? (
(y:b) // expected-error {{unexpected ':' in nested name specifier}}
4) : 5;
}