forked from OSchip/llvm-project
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:
parent
244b96ba0a
commit
3c674cf804
|
@ -565,9 +565,15 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
|
||||||
TypeTy *CastTy;
|
TypeTy *CastTy;
|
||||||
SourceLocation LParenLoc = Tok.getLocation();
|
SourceLocation LParenLoc = Tok.getLocation();
|
||||||
SourceLocation RParenLoc;
|
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) {
|
switch (ParenExprType) {
|
||||||
case SimpleExpr: break; // Nothing else to do.
|
case SimpleExpr: break; // Nothing else to do.
|
||||||
|
|
|
@ -48,8 +48,9 @@ namespace clang {
|
||||||
Parser &P;
|
Parser &P;
|
||||||
bool OldVal;
|
bool OldVal;
|
||||||
public:
|
public:
|
||||||
ColonProtectionRAIIObject(Parser &p) : P(p), OldVal(P.ColonIsSacred) {
|
ColonProtectionRAIIObject(Parser &p, bool Value = true)
|
||||||
P.ColonIsSacred = true;
|
: P(p), OldVal(P.ColonIsSacred) {
|
||||||
|
P.ColonIsSacred = Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// restore - This can be used to restore the state early, before the dtor
|
/// restore - This can be used to restore the state early, before the dtor
|
||||||
|
|
|
@ -9,7 +9,8 @@ struct Type {
|
||||||
|
|
||||||
// PR4451 - We should recover well from the typo of '::' as ':' in a2.
|
// PR4451 - We should recover well from the typo of '::' as ':' in a2.
|
||||||
namespace y {
|
namespace y {
|
||||||
struct a { };
|
struct a { };
|
||||||
|
typedef int b;
|
||||||
}
|
}
|
||||||
|
|
||||||
y::a a1;
|
y::a a1;
|
||||||
|
@ -45,4 +46,9 @@ struct a {
|
||||||
void test(struct Type *P) {
|
void test(struct Type *P) {
|
||||||
int Type;
|
int Type;
|
||||||
Type = 1 ? P->Type : 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;
|
||||||
}
|
}
|
Loading…
Reference in New Issue