Improve the diagnostic when we find something we did not expect in a

member expression (p-> or x.), by showing the type we looked into and
what we did actually find.

llvm-svn: 102315
This commit is contained in:
Douglas Gregor 2010-04-25 20:55:08 +00:00
parent 710cb20cd6
commit 861eb80a3b
4 changed files with 17 additions and 17 deletions

View File

@ -1865,9 +1865,9 @@ def err_typecheck_member_reference_arrow : Error<
def err_typecheck_member_reference_suggestion : Error<
"member reference type %0 is %select{a|not a}1 pointer; maybe you meant to use '%select{->|.}1'?">;
def err_typecheck_member_reference_type : Error<
"cannot refer to type member %0 with '%select{.|->}1'">;
"cannot refer to type member %0 in %1 with '%select{.|->}2'">;
def err_typecheck_member_reference_unknown : Error<
"cannot refer to member %0 with '%select{.|->}1'">;
"cannot refer to member %0 in %1 with '%select{.|->}2'">;
def err_member_reference_needs_call : Error<
"base of member reference has function type %0; perhaps you meant to call "
"this function with '()'?">;
@ -2181,8 +2181,8 @@ def warn_delete_incomplete : Warning<
"deleting pointer to incomplete type %0 may cause undefined behaviour">;
def err_no_suitable_delete_member_function_found : Error<
"no suitable member %0 in %1">;
def note_delete_member_function_declared_here : Note<
"%0 declared here">;
def note_member_declared_here : Note<
"member %0 declared here">;
def err_decrement_bool : Error<"cannot decrement expression of type bool">;
def warn_increment_bool : Warning<
"incrementing expression of type bool is deprecated">, InGroup<Deprecated>;

View File

@ -2824,16 +2824,17 @@ Sema::BuildMemberReferenceExpr(ExprArg Base, QualType BaseExprType,
Owned(BaseExpr);
// We found something that we didn't expect. Complain.
if (isa<TypeDecl>(MemberDecl))
return ExprError(Diag(MemberLoc,diag::err_typecheck_member_reference_type)
<< MemberName << int(IsArrow));
Diag(MemberLoc,diag::err_typecheck_member_reference_type)
<< MemberName << BaseType << int(IsArrow);
else
Diag(MemberLoc, diag::err_typecheck_member_reference_unknown)
<< MemberName << BaseType << int(IsArrow);
// We found a declaration kind that we didn't expect. This is a
// generic error message that tells the user that she can't refer
// to this member with '.' or '->'.
return ExprError(Diag(MemberLoc,
diag::err_typecheck_member_reference_unknown)
<< MemberName << int(IsArrow));
Diag(MemberDecl->getLocation(), diag::note_member_declared_here)
<< MemberName;
return ExprError();
}
/// Look up the given member of the given non-type-dependent

View File

@ -1261,8 +1261,7 @@ bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
for (LookupResult::iterator F = Found.begin(), FEnd = Found.end();
F != FEnd; ++F) {
Diag((*F)->getLocation(),
diag::note_delete_member_function_declared_here)
Diag((*F)->getLocation(), diag::note_member_declared_here)
<< Name;
}

View File

@ -2,7 +2,7 @@
class X{
public:
enum E {Enumerator};
enum E {Enumerator}; // expected-note 2{{declared here}}
int f();
static int mem;
static float g();
@ -11,8 +11,8 @@ public:
void test(X* xp, X x) {
int i1 = x.f();
int i2 = xp->f();
x.E; // expected-error{{cannot refer to type member 'E' with '.'}}
xp->E; // expected-error{{cannot refer to type member 'E' with '->'}}
x.E; // expected-error{{cannot refer to type member 'E' in 'X' with '.'}}
xp->E; // expected-error{{cannot refer to type member 'E' in 'X' with '->'}}
int i3 = x.Enumerator;
int i4 = xp->Enumerator;
x.mem = 1;