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