One thing I overlooked in my implementation of C++14 constexpr is that it changed operator= to be potentially constexpr.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit 445b5c0054f338e6c1904ae4ff09fa0761222fd3
Author: Jason Merrill <ja...@redhat.com>
Date:   Tue Mar 1 23:06:54 2016 -0500

    	* method.c (synthesized_method_walk): operator= can also be constexpr.

diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 0235e6a..38f2a54 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1379,9 +1379,18 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
 
   /* If that user-written default constructor would satisfy the
      requirements of a constexpr constructor (7.1.5), the
-     implicitly-defined default constructor is constexpr.  */
+     implicitly-defined default constructor is constexpr.
+
+     The implicitly-defined copy/move assignment operator is constexpr if
+      - X is a literal type, and
+      - the assignment operator selected to copy/move each direct base class
+	subobject is a constexpr function, and
+      - for each non-static data member of X that is of class type (or array
+	thereof), the assignment operator selected to copy/move that member is a
+	constexpr function.  */
   if (constexpr_p)
-    *constexpr_p = ctor_p;
+    *constexpr_p = ctor_p
+      || (assign_p && cxx_dialect >= cxx14);
 
   move_p = false;
   switch (sfk)
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-assign1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-assign1.C
new file mode 100644
index 0000000..4583b64
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-assign1.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++14 } }
+
+struct A { };
+
+struct B
+{
+  A a;
+  constexpr B& operator=(const B&) = default;
+};

Reply via email to