[cfe-commits] r169574 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp

Richard Smith richard-llvm at metafoo.co.uk
Thu Dec 6 18:10:28 PST 2012


Author: rsmith
Date: Thu Dec  6 20:10:28 2012
New Revision: 169574

URL: http://llvm.org/viewvc/llvm-project?rev=169574&view=rev
Log:
Per [dcl.fct.def.default]p1, don't allow variadic special members to be defaulted.

Added:
    cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp
Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=169574&r1=169573&r2=169574&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Dec  6 20:10:28 2012
@@ -4223,6 +4223,10 @@
     Diag(MD->getLocation(), diag::err_defaulted_special_member_params)
       << CSM << MD->getSourceRange();
     HadError = true;
+  } else if (MD->isVariadic()) {
+    Diag(MD->getLocation(), diag::err_defaulted_special_member_variadic)
+      << CSM << MD->getSourceRange();
+    HadError = true;
   }
 
   const FunctionProtoType *Type = MD->getType()->getAs<FunctionProtoType>();

Added: cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp?rev=169574&view=auto
==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp (added)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp Thu Dec  6 20:10:28 2012
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -verify %s -std=c++11
+
+// A function that is explicitly defaulted shall
+struct A {
+  // -- be a special member function,
+  A(int) = default; // expected-error {{only special member functions may be defaulted}}
+
+  // -- have the same declared function type as if it had been implicitly
+  //    declared
+  void operator=(const A &) = default; // expected-error {{must return 'A &'}}
+  A(...) = default; // expected-error {{cannot be variadic}}
+  A(const A &, ...) = default; // expected-error {{cannot be variadic}}
+
+  //    (except for possibly differing ref-qualifiers
+  A &operator=(A &&) & = default;
+
+  // FIXME:
+  //    and except that in the case of a copy constructor or copy assignment
+  //    operator, the parameter type may be "reference to non-const T")
+  A(A &) = default; // FIXME: expected-error {{must be defaulted outside the class}}
+  A &operator=(A &) = default; // FIXME: expected-error {{must be defaulted outside the class}}
+
+  // -- not have default arguments
+  A(double = 0.0) = default; // expected-error {{cannot have default arguments}}
+  A(const A & = 0) = default; // expected-error {{cannot have default arguments}}
+};





More information about the cfe-commits mailing list