[cfe-commits] r131792 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExpr.cpp test/CXX/expr/expr.post/expr.call/p7-0x.cpp

Douglas Gregor dgregor at apple.com
Sat May 21 09:27:21 PDT 2011


Author: dgregor
Date: Sat May 21 11:27:21 2011
New Revision: 131792

URL: http://llvm.org/viewvc/llvm-project?rev=131792&view=rev
Log:
Implement C++0x semantics for passing non-POD classes through varargs.

Added:
    cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp   (with props)
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=131792&r1=131791&r2=131792&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat May 21 11:27:21 2011
@@ -3324,8 +3324,8 @@
   "%select{function|block|method}1">;
 
 def warn_cannot_pass_non_pod_arg_to_vararg : Warning<
-  "cannot pass object of non-POD type %0 through variadic "
-  "%select{function|block|method|constructor}1; call will abort at runtime">,
+  "cannot pass object of %select{non-POD|non-trivial}0 type %1 through variadic"
+  " %select{function|block|method|constructor}2; call will abort at runtime">,
   InGroup<DiagGroup<"non-pod-varargs">>, DefaultError;
 
 def err_typecheck_call_invalid_ordered_compare : Error<

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=131792&r1=131791&r2=131792&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat May 21 11:27:21 2011
@@ -455,12 +455,32 @@
           << E->getType() << CT))
     return ExprError();
 
-  if (!E->getType()->isPODType() &&
-      DiagRuntimeBehavior(E->getLocStart(), 0,
+  // C++ [expr.call]p7 prohibits non-POD types.
+  if (!E->getType()->isPODType()) {
+    // C++0x [expr.call]p7:
+    //   Passing a potentially-evaluated argument of class type (Clause 9) 
+    //   having a non-trivial copy constructor, a non-trivial move constructor,
+    //   or a non-trivial destructor, with no corresponding parameter, 
+    //   is conditionally-supported with implementation-defined semantics.
+    bool TrivialEnough = false;
+    if (getLangOptions().CPlusPlus0x && !E->getType()->isDependentType())  {
+      if (CXXRecordDecl *Record = E->getType()->getAsCXXRecordDecl()) {
+        if (Record->hasTrivialCopyConstructor() &&
+            Record->hasTrivialMoveConstructor() &&
+            Record->hasTrivialDestructor())
+          TrivialEnough = true;
+      }
+    }
+      
+    if (TrivialEnough) {
+      // Nothing to diagnose. This is okay.
+    } else if (DiagRuntimeBehavior(E->getLocStart(), 0,
                           PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
-                            << E->getType() << CT))
-    return ExprError();
-
+                            << getLangOptions().CPlusPlus0x << E->getType() 
+                            << CT))
+      return ExprError();
+  }
+  
   return Owned(E);
 }
 

Added: cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp?rev=131792&view=auto
==============================================================================
--- cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp (added)
+++ cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp Sat May 21 11:27:21 2011
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
+
+struct X1 {
+  X1();
+};
+
+struct X2 {
+  X2();
+  ~X2();
+};
+
+void vararg(...);
+
+void f(X1 x1, X2 x2) {
+  vararg(x1); // okay
+  vararg(x2); // expected-error{{cannot pass object of non-trivial type 'X2' through variadic function; call will abort at runtime}}
+}

Propchange: cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cfe/trunk/test/CXX/expr/expr.post/expr.call/p7-0x.cpp
------------------------------------------------------------------------------
    svn:mime-type = text/plain





More information about the cfe-commits mailing list