Add negative test cases and fix diagnostics for member pointer dereferencing.
llvm-svn: 63987
This commit is contained in:
parent
d404862cf9
commit
9c3b4b1bc5
|
@ -867,8 +867,8 @@ DIAG(err_bad_memptr_rhs, ERROR,
|
|||
"right hand operand to %0 must be a pointer to member of a complete class "
|
||||
"but is %1")
|
||||
DIAG(err_bad_memptr_lhs, ERROR,
|
||||
"left hand operand to ->* must be a %select{|pointer to }0class "
|
||||
"compatible with the right hand operand, but is %1")
|
||||
"left hand operand to %0 must be a %select{|pointer to }1class "
|
||||
"compatible with the right hand operand, but is %2")
|
||||
|
||||
DIAG(err_invalid_use_of_function_type, ERROR,
|
||||
"a function type is not allowed here")
|
||||
|
|
|
@ -2731,7 +2731,7 @@ inline QualType Sema::CheckPointerToMemberOperands(
|
|||
LType = Ptr->getPointeeType().getNonReferenceType();
|
||||
else {
|
||||
Diag(Loc, diag::err_bad_memptr_lhs)
|
||||
<< 1 << LType << lex->getSourceRange();
|
||||
<< OpSpelling << 1 << LType << lex->getSourceRange();
|
||||
return QualType();
|
||||
}
|
||||
}
|
||||
|
@ -2744,7 +2744,7 @@ inline QualType Sema::CheckPointerToMemberOperands(
|
|||
// or is that overkill?
|
||||
if (!IsDerivedFrom(LType, Class, Paths) ||
|
||||
Paths.isAmbiguous(Context.getCanonicalType(Class))) {
|
||||
Diag(Loc, diag::err_bad_memptr_lhs)
|
||||
Diag(Loc, diag::err_bad_memptr_lhs) << OpSpelling
|
||||
<< (int)isIndirect << lex->getType() << lex->getSourceRange();
|
||||
return QualType();
|
||||
}
|
||||
|
|
|
@ -80,6 +80,8 @@ void g() {
|
|||
void (HasMembers::*pmd)() = &HasMembers::d;
|
||||
}
|
||||
|
||||
struct Incomplete;
|
||||
|
||||
void h() {
|
||||
HasMembers hm, *phm = &hm;
|
||||
|
||||
|
@ -93,6 +95,27 @@ void h() {
|
|||
void (HasMembers::*pf)() = &HasMembers::f;
|
||||
(hm.*pf)();
|
||||
(phm->*pf)();
|
||||
|
||||
(void)(hm->*pi); // expected-error {{left hand operand to ->* must be a pointer to class compatible with the right hand operand, but is 'struct HasMembers'}}
|
||||
(void)(phm.*pi); // expected-error {{left hand operand to .* must be a class compatible with the right hand operand, but is 'struct HasMembers *'}}
|
||||
(void)(i.*pi); // expected-error {{left hand operand to .* must be a class compatible with the right hand operand, but is 'int'}}
|
||||
int *ptr;
|
||||
(void)(ptr->*pi); // expected-error {{left hand operand to ->* must be a pointer to class compatible with the right hand operand, but is 'int *'}}
|
||||
|
||||
int A::*pai = 0;
|
||||
D d, *pd = &d;
|
||||
(void)(d.*pai);
|
||||
(void)(pd->*pai);
|
||||
F f, *ptrf = &f;
|
||||
(void)(f.*pai); // expected-error {{left hand operand to .* must be a class compatible with the right hand operand, but is 'struct F'}}
|
||||
(void)(ptrf->*pai); // expected-error {{left hand operand to ->* must be a pointer to class compatible with the right hand operand, but is 'struct F *'}}
|
||||
|
||||
(void)(hm.*i); // expected-error {{right hand operand to .* must be a pointer to member of a complete class but is 'int'}}
|
||||
(void)(phm->*i); // expected-error {{right hand operand to ->* must be a pointer to member of a complete class but is 'int'}}
|
||||
|
||||
Incomplete *inc;
|
||||
int Incomplete::*pii = 0;
|
||||
(void)inc->*pii; // expected-error {{right hand operand to ->* must be a pointer to member of a complete class but is 'int struct Incomplete::*'}}
|
||||
}
|
||||
|
||||
struct OverloadsPtrMem
|
||||
|
|
Loading…
Reference in New Issue