forked from OSchip/llvm-project
Fix typo correction of template arguments to once again allow type names.
llvm-svn: 151112
This commit is contained in:
parent
9c4cd1bfb1
commit
0178200062
|
@ -1288,7 +1288,7 @@ private:
|
|||
};
|
||||
|
||||
ExprResult ParseExpression(TypeCastState isTypeCast = NotTypeCast);
|
||||
ExprResult ParseConstantExpression();
|
||||
ExprResult ParseConstantExpression(TypeCastState isTypeCast = NotTypeCast);
|
||||
// Expr that doesn't include commas.
|
||||
ExprResult ParseAssignmentExpression(TypeCastState isTypeCast = NotTypeCast);
|
||||
|
||||
|
|
|
@ -249,7 +249,7 @@ Parser::ParseAssignmentExprWithObjCMessageExprStart(SourceLocation LBracLoc,
|
|||
}
|
||||
|
||||
|
||||
ExprResult Parser::ParseConstantExpression() {
|
||||
ExprResult Parser::ParseConstantExpression(TypeCastState isTypeCast) {
|
||||
// C++03 [basic.def.odr]p2:
|
||||
// An expression is potentially evaluated unless it appears where an
|
||||
// integral constant expression is required (see 5.19) [...].
|
||||
|
@ -257,7 +257,7 @@ ExprResult Parser::ParseConstantExpression() {
|
|||
EnterExpressionEvaluationContext Unevaluated(Actions,
|
||||
Sema::ConstantEvaluated);
|
||||
|
||||
ExprResult LHS(ParseCastExpression(false));
|
||||
ExprResult LHS(ParseCastExpression(false, false, isTypeCast));
|
||||
return ParseRHSOfBinaryExpression(LHS, prec::Conditional);
|
||||
}
|
||||
|
||||
|
|
|
@ -1037,7 +1037,7 @@ ParsedTemplateArgument Parser::ParseTemplateArgument() {
|
|||
|
||||
// Parse a non-type template argument.
|
||||
SourceLocation Loc = Tok.getLocation();
|
||||
ExprResult ExprArg = ParseConstantExpression();
|
||||
ExprResult ExprArg = ParseConstantExpression(MaybeTypeCast);
|
||||
if (ExprArg.isInvalid() || !ExprArg.get())
|
||||
return ParsedTemplateArgument();
|
||||
|
||||
|
|
|
@ -167,3 +167,19 @@ class Parent {
|
|||
};
|
||||
class Child: public Parent {};
|
||||
void Child::add_types(int value) {} // expected-error{{out-of-line definition of 'add_types' does not match any declaration in 'Child'}}
|
||||
|
||||
// Fix the callback based filtering of typo corrections within
|
||||
// Sema::ActOnIdExpression by Parser::ParseCastExpression to allow type names as
|
||||
// potential corrections for template arguments.
|
||||
namespace clash {
|
||||
class ConstructExpr {}; // expected-note{{'clash::ConstructExpr' declared here}}
|
||||
}
|
||||
class ClashTool {
|
||||
bool HaveConstructExpr();
|
||||
template <class T> T* getExprAs();
|
||||
|
||||
void test() {
|
||||
ConstructExpr *expr = // expected-error{{unknown type name 'ConstructExpr'; did you mean 'clash::ConstructExpr'?}}
|
||||
getExprAs<ConstructExpr>(); // expected-error{{use of undeclared identifier 'ConstructExpr'; did you mean 'clash::ConstructExpr'?}}
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue