forked from OSchip/llvm-project
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:
parent
710cb20cd6
commit
861eb80a3b
|
@ -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>;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue