re PR c++/64647 ([C++14] std::__max_element contains code not allowed in constexpr...
authorJason Merrill <jason@redhat.com>
Wed, 21 Jan 2015 20:15:35 +0000 (15:15 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 21 Jan 2015 20:15:35 +0000 (15:15 -0500)
PR c++/64647
* constexpr.c (ensure_literal_type_for_constexpr_object): Don't
give a hard error in a template instantiation.

From-SVN: r219965

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp1y/constexpr-local3.C [new file with mode: 0644]

index d5b3cd8ad43b998389e48322fdd2182c5cd566c5..526742c0bcebe42d0bdc2d5c6b4ae989ce411f6d 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-21  Jason Merrill  <jason@redhat.com>
+
+       PR c++/64647
+       * constexpr.c (ensure_literal_type_for_constexpr_object): Don't
+       give a hard error in a template instantiation.
+
 2015-01-21  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/64313
index 0d474245d36166d5db7ad938cff9bec1df04a219..decc84d301ff9fcf81183eb3568cc981d645549b 100644 (file)
@@ -102,15 +102,21 @@ ensure_literal_type_for_constexpr_object (tree decl)
       else if (!literal_type_p (type))
        {
          if (DECL_DECLARED_CONSTEXPR_P (decl))
-           error ("the type %qT of constexpr variable %qD is not literal",
-                  type, decl);
+           {
+             error ("the type %qT of constexpr variable %qD is not literal",
+                    type, decl);
+             explain_non_literal_class (type);
+           }
          else
            {
-             error ("variable %qD of non-literal type %qT in %<constexpr%> "
-                    "function", decl, type);
+             if (!DECL_TEMPLATE_INSTANTIATION (current_function_decl))
+               {
+                 error ("variable %qD of non-literal type %qT in %<constexpr%> "
+                        "function", decl, type);
+                 explain_non_literal_class (type);
+               }
              cp_function_chain->invalid_constexpr = true;
            }
-         explain_non_literal_class (type);
          return NULL;
        }
     }
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-local3.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-local3.C
new file mode 100644 (file)
index 0000000..76d4b55
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/64647
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+constexpr T foo(T t)
+{
+  T tt = t;
+  return tt;
+}
+
+struct X
+{
+  X() { }
+};
+
+int main()
+{
+  X x;
+  foo(x);
+}