[cfe-commits] r62323 - in /cfe/trunk: lib/Sema/Sema.h lib/Sema/SemaExpr.cpp lib/Sema/SemaExprObjC.cpp lib/Sema/SemaOverload.cpp test/SemaCXX/vararg-non-pod.cpp test/SemaObjCXX/vararg-non-pod.mm
Douglas Gregor
dgregor at apple.com
Fri Jan 16 10:03:09 PST 2009
On Jan 16, 2009, at 8:48 AM, Anders Carlsson wrote:
> Author: andersca
> Date: Fri Jan 16 10:48:51 2009
> New Revision: 62323
>
> URL: http://llvm.org/viewvc/llvm-project?rev=62323&view=rev
> Log:
> Use a single function for doing vararg argument promotion. Also,
> make sure to do the promotion before checking the type - fixes PR3340.
This looks great, Anders. Thanks!
- Doug
>
> Modified:
> cfe/trunk/lib/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/lib/Sema/SemaExprObjC.cpp
> cfe/trunk/lib/Sema/SemaOverload.cpp
> cfe/trunk/test/SemaCXX/vararg-non-pod.cpp
> cfe/trunk/test/SemaObjCXX/vararg-non-pod.mm
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=62323&r1=62322&r2=62323&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Fri Jan 16 10:48:51 2009
> @@ -1523,6 +1523,17 @@
> // do not have a prototype. Integer promotions are performed on each
> // argument, and arguments that have type float are promoted to
> double.
> void DefaultArgumentPromotion(Expr *&Expr);
> +
> + // Used for emitting the right warning by
> DefaultVariadicArgumentPromotion
> + enum VariadicCallType {
> + VariadicFunction,
> + VariadicBlock,
> + VariadicMethod
> + };
> +
> + // DefaultVariadicArgumentPromotion - Like
> DefaultArgumentPromotion, but
> + // will warn if the resulting type is not a POD type.
> + void DefaultVariadicArgumentPromotion(Expr *&Expr,
> VariadicCallType CT);
>
> // UsualArithmeticConversions - performs the UsualUnaryConversions
> on it's
> // operands and then handles various conversions that are common
> to binary
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=62323&r1=62322&r2=62323&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jan 16 10:48:51 2009
> @@ -87,6 +87,21 @@
> UsualUnaryConversions(Expr);
> }
>
> +// DefaultVariadicArgumentPromotion - Like
> DefaultArgumentPromotion, but
> +// will warn if the resulting type is not a POD type.
> +void Sema::DefaultVariadicArgumentPromotion(Expr *&Expr,
> VariadicCallType CT)
> +
> +{
> + DefaultArgumentPromotion(Expr);
> +
> + if (!Expr->getType()->isPODType()) {
> + Diag(Expr->getLocStart(),
> + diag::warn_cannot_pass_non_pod_arg_to_vararg) <<
> + Expr->getType() << CT;
> + }
> +}
> +
> +
> /// UsualArithmeticConversions - Performs various conversions that
> are common to
> /// binary operators (C99 6.3.1.8). If both operands aren't
> arithmetic, this
> /// routine returns the first non-arithmetic type found. The client is
> @@ -1703,21 +1718,16 @@
>
> // If this is a variadic call, handle args passed through "...".
> if (Proto->isVariadic()) {
> + VariadicCallType CallType = VariadicFunction;
> + if (Fn->getType()->isBlockPointerType())
> + CallType = VariadicBlock; // Block
> + else if (isa<MemberExpr>(Fn))
> + CallType = VariadicMethod;
> +
> // Promote the arguments (C99 6.5.2.2p7).
> for (unsigned i = NumArgsInProto; i != NumArgs; i++) {
> Expr *Arg = Args[i];
> - if (!Arg->getType()->isPODType()) {
> - int CallType = 0;
> - if (Fn->getType()->isBlockPointerType())
> - CallType = 1; // Block
> - else if (isa<MemberExpr>(Fn))
> - CallType = 2;
> -
> - Diag(Arg->getLocStart(),
> - diag::warn_cannot_pass_non_pod_arg_to_vararg) <<
> - Arg->getType() << CallType;
> - }
> - DefaultArgumentPromotion(Arg);
> + DefaultVariadicArgumentPromotion(Arg, CallType);
> Call->setArg(i, Arg);
> }
> }
>
> Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=62323&r1=62322&r2=62323&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Fri Jan 16 10:48:51 2009
> @@ -156,15 +156,8 @@
>
> // Promote additional arguments to variadic methods.
> if (Method->isVariadic()) {
> - for (unsigned i = NumNamedArgs; i < NumArgs; ++i) {
> - if (!Args[i]->getType()->isPODType()) {
> - Diag(Args[i]->getLocStart(),
> - diag::warn_cannot_pass_non_pod_arg_to_vararg) <<
> - Args[i]->getType() << 2; // Method
> - }
> -
> - DefaultArgumentPromotion(Args[i]);
> - }
> + for (unsigned i = NumNamedArgs; i < NumArgs; ++i)
> + DefaultVariadicArgumentPromotion(Args[i], VariadicMethod);
> } else {
> // Check for extra arguments to non-variadic methods.
> if (NumArgs != NumNamedArgs) {
>
> Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=62323&r1=62322&r2=62323&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaOverload.cpp Fri Jan 16 10:48:51 2009
> @@ -3624,14 +3624,8 @@
> // Promote the arguments (C99 6.5.2.2p7).
> for (unsigned i = NumArgsInProto; i != NumArgs; i++) {
> Expr *Arg = Args[i];
> -
> - if (!Arg->getType()->isPODType()) {
> - Diag(Arg->getLocStart(),
> - diag::warn_cannot_pass_non_pod_arg_to_vararg) <<
> - Arg->getType() << 2; // Method
> - }
>
> - DefaultArgumentPromotion(Arg);
> + DefaultVariadicArgumentPromotion(Arg, VariadicMethod);
> TheCall->setArg(i + 1, Arg);
> }
> }
>
> 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=62323&r1=62322&r2=62323&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/test/SemaCXX/vararg-non-pod.cpp (original)
> +++ cfe/trunk/test/SemaCXX/vararg-non-pod.cpp Fri Jan 16 10:48:51 2009
> @@ -1,5 +1,7 @@
> // RUN: clang -fsyntax-only -verify -fblocks %s
>
> +extern char version[];
> +
> class C {
> public:
> C(int);
> @@ -14,6 +16,7 @@
> C c(10);
>
> g(10, c); // expected-warning{{cannot pass object of non-POD type
> 'class C' through variadic function; call will abort at runtime}}
> + g(10, version);
> }
>
> void t2()
> @@ -21,8 +24,10 @@
> C c(10);
>
> c.g(10, c); // expected-warning{{cannot pass object of non-POD
> type 'class C' through variadic method; call will abort at runtime}}
> + c.g(10, version);
>
> C::h(10, c); // expected-warning{{cannot pass object of non-POD
> type 'class C' through variadic function; call will abort at runtime}}
> + C::h(10, version);
> }
>
> int (^block)(int, ...);
> @@ -32,6 +37,7 @@
> C c(10);
>
> block(10, c); // expected-warning{{cannot pass object of non-POD
> type 'class C' through variadic block; call will abort at runtime}}
> + block(10, version);
> }
>
> class D {
> @@ -46,4 +52,5 @@
> D d;
>
> d(10, c); // expected-warning{{Line 48: cannot pass object of non-
> POD type 'class C' through variadic method; call will abort at
> runtime}}
> + d(10, version);
> }
>
> Modified: cfe/trunk/test/SemaObjCXX/vararg-non-pod.mm
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/vararg-non-pod.mm?rev=62323&r1=62322&r2=62323&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/test/SemaObjCXX/vararg-non-pod.mm (original)
> +++ cfe/trunk/test/SemaObjCXX/vararg-non-pod.mm Fri Jan 16 10:48:51
> 2009
> @@ -1,5 +1,7 @@
> // RUN: clang -fsyntax-only -verify %s
>
> +extern char version[];
> +
> class C {
> public:
> C(int);
> @@ -14,5 +16,6 @@
> C c(10);
>
> [d g:10, c]; // expected-warning{{cannot pass object of non-POD
> type 'class C' through variadic method; call will abort at runtime}}
> + [d g:10, version];
> }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list