r184629 - Extend -Wnon-pod-varargs to check calls made from member pointers.

Richard Trieu rtrieu at google.com
Fri Jun 21 19:30:38 PDT 2013


Author: rtrieu
Date: Fri Jun 21 21:30:38 2013
New Revision: 184629

URL: http://llvm.org/viewvc/llvm-project?rev=184629&view=rev
Log:
Extend -Wnon-pod-varargs to check calls made from member pointers.

Modified:
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/SemaCXX/vararg-non-pod.cpp

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=184629&r1=184628&r2=184629&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jun 21 21:30:38 2013
@@ -3798,7 +3798,8 @@ Sema::getVariadicCallType(FunctionDecl *
       if (CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
         if (Method->isInstance())
           return VariadicMethod;
-    }
+    } else if (Fn && Fn->getType() == Context.BoundMemberTy)
+      return VariadicMethod;
     return VariadicFunction;
   }
   return VariadicDoesNotApply;

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=184629&r1=184628&r2=184629&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Fri Jun 21 21:30:38 2013
@@ -10895,6 +10895,9 @@ Sema::BuildCallToMemberFunction(Scope *S
     if (ConvertArgumentsForCall(call, op, 0, proto, Args, RParenLoc))
       return ExprError();
 
+    if (CheckOtherCall(call, proto))
+      return ExprError();
+
     return MaybeBindToTemporary(call);
   }
 

Modified: cfe/trunk/test/SemaCXX/vararg-non-pod.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/vararg-non-pod.cpp?rev=184629&r1=184628&r2=184629&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/vararg-non-pod.cpp (original)
+++ cfe/trunk/test/SemaCXX/vararg-non-pod.cpp Fri Jun 21 21:30:38 2013
@@ -31,7 +31,7 @@ void t2()
   c.g(10, version);
 
   void (C::*ptr)(int, ...) = &C::g;
-  (c.*ptr)(10, c);  // TODO: This should also warn.
+  (c.*ptr)(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
   (c.*ptr)(10, version);
  
   C::h(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
@@ -173,7 +173,7 @@ namespace t11 {
     (get_f_ptr())(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
     (get_f_ptr())(10, version);
 
-    (c.*get_m_ptr())(10, c); // TODO: This should also warn.
+    (c.*get_m_ptr())(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
     (c.*get_m_ptr())(10, version);
 
     (get_b_ptr())(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}}
@@ -182,7 +182,7 @@ namespace t11 {
     (arr_f_ptr[3])(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
     (arr_f_ptr[3])(10, version);
 
-    (c.*arr_m_ptr[3])(10, c); // TODO: This should also warn.
+    (c.*arr_m_ptr[3])(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
     (c.*arr_m_ptr[3])(10, version);
 
     (arr_b_ptr[3])(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}}





More information about the cfe-commits mailing list