re PR c++/47199 ([C++0x] ICE: expected class 'type', have 'declaration' (function_dec...
authorJason Merrill <jason@redhat.com>
Mon, 21 Feb 2011 05:25:56 +0000 (00:25 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 21 Feb 2011 05:25:56 +0000 (00:25 -0500)
PR c++/47199
* semantics.c (cxx_eval_call_expression): Call
cxx_eval_constant_expression in trivial shortcut.

From-SVN: r170356

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

index 4ce3f27..9fde00c 100644 (file)
@@ -1,5 +1,9 @@
 2011-02-20  Jason Merrill  <jason@redhat.com>
 
+       PR c++/47199
+       * semantics.c (cxx_eval_call_expression): Call
+       cxx_eval_constant_expression in trivial shortcut.
+
        PR c++/46831
        * call.c (convert_class_to_reference): Don't try to set up a
        second conv sequence for non-viable candidates.
index 8944690..b7ed525 100644 (file)
@@ -6021,7 +6021,11 @@ cxx_eval_call_expression (const constexpr_call *old_call, tree t,
 
   /* Shortcut trivial copy constructor/op=.  */
   if (call_expr_nargs (t) == 2 && trivial_fn_p (fun))
-    return convert_from_reference (get_nth_callarg (t, 1));
+    {
+      tree arg = convert_from_reference (get_nth_callarg (t, 1));
+      return cxx_eval_constant_expression (old_call, arg, allow_non_constant,
+                                          addr, non_constant_p);
+    }
 
   /* If in direct recursive call, optimize definition search.  */
   if (old_call != NULL && old_call->fundef->decl == fun)
index db45d88..77b0bef 100644 (file)
@@ -1,5 +1,7 @@
 2011-02-20  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/constexpr-ctor7.C: New.
+
        * g++.dg/cpp0x/fntmpdefarg2.C: New.
 
        * g++.dg/overload/conv-op1.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C
new file mode 100644 (file)
index 0000000..8338bf1
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/47199
+// { dg-options "-std=c++0x -fno-elide-constructors" }
+
+template < int > struct S
+{
+  constexpr S (int r):rr (r)
+  {
+  }
+  S (const S &) = default;
+  static constexpr S s ()
+  {
+    return -1;
+  }
+  int rr;
+};
+
+static const int d = S < 0 >::s ().rr;