[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