Provide a better diagnostic and a fixit for a '.' or '->' before the left paren

of a function call.

This fixes PR5898 and means we now have a better diagnostic here than GCC.

llvm-svn: 186208
This commit is contained in:
Kaelyn Uhrain 2013-07-12 21:43:02 +00:00
parent c037383aff
commit 638264ea2a
3 changed files with 30 additions and 1 deletions

View File

@ -498,6 +498,9 @@ def err_misplaced_ellipsis_in_declaration : Error<
def ext_abstract_pack_declarator_parens : ExtWarn<
"ISO C++11 requires a parenthesized pack declaration to have a name">,
InGroup<DiagGroup<"anonymous-pack-parens">>;
def err_function_is_not_record : Error<
"unexpected '%select{.|->}0' in function call; perhaps remove the "
"'%select{.|->}0'?">;
// C++ derived classes
def err_dup_virtual : Error<"duplicate 'virtual' in base specifier">;

View File

@ -1457,7 +1457,19 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
ParsedType ObjectType;
bool MayBePseudoDestructor = false;
if (getLangOpts().CPlusPlus && !LHS.isInvalid()) {
LHS = Actions.ActOnStartCXXMemberReference(getCurScope(), LHS.take(),
Expr *Base = LHS.take();
const Type* BaseType = Base->getType().getTypePtrOrNull();
if (BaseType && Tok.is(tok::l_paren) &&
(BaseType->isFunctionType() ||
BaseType->getAsPlaceholderType()->getKind() ==
BuiltinType::BoundMember)) {
Diag(OpLoc, diag::err_function_is_not_record)
<< (OpKind == tok::arrow) << Base->getSourceRange()
<< FixItHint::CreateRemoval(OpLoc);
return ParsePostfixExpressionSuffix(Base);
}
LHS = Actions.ActOnStartCXXMemberReference(getCurScope(), Base,
OpLoc, OpKind, ObjectType,
MayBePseudoDestructor);
if (LHS.isInvalid())

View File

@ -324,3 +324,17 @@ namespace PR15045 {
return c->a; // expected-error {{member reference type 'PR15045::Cl0' is not a pointer; maybe you meant to use '.'?}}
}
}
namespace PR5898 {
class A {
public:
const char *str();
};
const char* foo(A &x)
{
return x.str.(); // expected-error {{unexpected '.' in function call; perhaps remove the '.'?}}
}
bool bar(A x, const char *y) {
return foo->(x) == y; // expected-error {{unexpected '->' in function call; perhaps remove the '->'?}}
}
}