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;
+};