From 7878ffde0c48a33a8fd3819be1b797d52f7b3849 Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Sat, 7 Feb 2009 00:41:42 +0000 Subject: [PATCH] Add negative test cases and fix diagnostics for member pointer dereferencing. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63987 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.def | 4 ++-- lib/Sema/SemaExpr.cpp | 4 ++-- test/SemaCXX/member-pointer.cpp | 23 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/clang/Basic/DiagnosticSemaKinds.def b/include/clang/Basic/DiagnosticSemaKinds.def index 298e0fe272..a18ed966f3 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.def +++ b/include/clang/Basic/DiagnosticSemaKinds.def @@ -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") diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 3de916fe3c..201a0f99e3 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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(); } diff --git a/test/SemaCXX/member-pointer.cpp b/test/SemaCXX/member-pointer.cpp index 7d71b49fca..449ff9f73d 100644 --- a/test/SemaCXX/member-pointer.cpp +++ b/test/SemaCXX/member-pointer.cpp @@ -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 -- 2.40.0