]> granicus.if.org Git - clang/commitdiff
Check the return type when calling pointer to member functions.
authorAnders Carlsson <andersca@mac.com>
Thu, 15 Oct 2009 00:41:48 +0000 (00:41 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 15 Oct 2009 00:41:48 +0000 (00:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84161 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaCXX/incomplete-call.cpp

index d8e49c7d694109ba13f3c394091c195c94817cf3..a946500660e8f8f7ee38851a2eaccc558fe26759 100644 (file)
@@ -2917,15 +2917,18 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc,
       if (BO->getOpcode() == BinaryOperator::PtrMemD ||
           BO->getOpcode() == BinaryOperator::PtrMemI) {
         const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType());
-        QualType ReturnTy = FPT->getResultType();
+        QualType ResultTy = FPT->getResultType().getNonReferenceType();
       
-        CXXMemberCallExpr *CE = 
-          new (Context) CXXMemberCallExpr(Context, BO, Args, NumArgs,
-                                          ReturnTy.getNonReferenceType(),
-                                          RParenLoc);
-        
-        ExprOwningPtr<CXXMemberCallExpr> TheCall(this, CE);
+        ExprOwningPtr<CXXMemberCallExpr> 
+          TheCall(this, new (Context) CXXMemberCallExpr(Context, BO, Args, 
+                                                        NumArgs, ResultTy,
+                                                        RParenLoc));
         
+        if (CheckCallReturnType(FPT->getResultType(), 
+                                BO->getRHS()->getSourceRange().getBegin(), 
+                                TheCall.get(), 0))
+          return ExprError();
+
         if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs, 
                                     RParenLoc))
           return ExprError();
index 6134189f0a9aa7bc0af4ba82551ce14d4cc3b6be..08bfdefd6247869091293d123a5caf30d31b5e39 100644 (file)
@@ -1,5 +1,5 @@
 // RUN: clang-cc -fsyntax-only -verify %s
-struct A; // expected-note 13 {{forward declaration of 'struct A'}}
+struct A; // expected-note 14 {{forward declaration of 'struct A'}}
 
 A f(); // expected-note {{note: 'f' declared here}}
 
@@ -35,4 +35,8 @@ void g() {
   b[0]; // expected-error {{calling 'operator[]' with incomplete return type 'struct A'}}
   b + 1; // expected-error {{calling 'operator+' with incomplete return type 'struct A'}}
   b->f(); // expected-error {{calling 'operator->' with incomplete return type 'struct A'}}
+  
+  A (B::*mfp)() = 0;
+  (b.*mfp)(); // expected-error {{calling function with incomplete return type 'struct A'}}
+  
 }