re PR c++/48089 ([C++0x] ICE on in(?)valid in constexpr constructors)
authorJason Merrill <jason@redhat.com>
Tue, 29 Mar 2011 18:47:43 +0000 (14:47 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 29 Mar 2011 18:47:43 +0000 (14:47 -0400)
PR c++/48089
* semantics.c (potential_constant_expression_1): Change error about
use of *this in constructor into sorry.

From-SVN: r171687

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C

index 1ffe70b3933bf8914aca1bd7b94e01f3cbaabd9f..3d0c02a44fa89d6fb1e96b5d9557f11d1736bdcb 100644 (file)
@@ -1,5 +1,9 @@
 2011-03-29  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48089
+       * semantics.c (potential_constant_expression_1): Change error about
+       use of *this in constructor into sorry.
+
        PR c++/48296
        * decl.c (cp_finish_decl): Defer validation of constexpr member
        functions.
index f1c3d9af3000120fa9d2090269eafc83db3a2d47..5a659434de68979619c340cf0e3dd7064314c84d 100644 (file)
@@ -7495,8 +7495,8 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
            if (DECL_CONSTRUCTOR_P (DECL_CONTEXT (x)) && want_rval)
              {
                if (flags & tf_error)
-                 error ("the value of the object being constructed is "
-                        "not a constant expression");
+                 sorry ("use of the value of the object being constructed "
+                        "in a constant expression");
                return false;
              }
            return true;
index 5cb4f4e2cb63c3ed70dce39d8fbb4ad08801b128..fbd21e5d3a41cce685bb4d2ab0c46a0f9c434d3a 100644 (file)
@@ -1,5 +1,7 @@
 2011-03-29  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/constexpr-48089.C: Adjust.
+
        * g++.dg/cpp0x/constexpr-memfn1.C: New.
 
        * g++.dg/cpp0x/constexpr-diag1.C: Adjust error locations.
index 88ef3d685d328109e357b3eb721843944dc42cec..fc69cfef6780d1f352c45bdd2c5ae91cb7261948 100644 (file)
@@ -1,9 +1,24 @@
 // PR c++/48089
 // { dg-options -std=c++0x }
 
+// bang is ill-formed (diagnostic required) because its initializer is
+// non-constant, because it uses the value of an uninitialized object.
+
+// s() is ill-formed (no diagnostic required) because there is no set of
+// arguments that would produce a constant expression.
+
+// R() is well-formed because i is initialized before j.
+
 struct s {
-    constexpr s() : v(v) { }   // { dg-error "object being constructed" }
-    char v;
+  constexpr s() : v(v) { }     // { dg-message "" }
+  int v;
+};
+
+constexpr s bang;              // { dg-error "" }
+
+struct R {
+  int i,j;
+  constexpr R() : i(42),j(i) { } // { dg-bogus "" "" { xfail *-*-* } }
 };
 
-s bang;
+constexpr R r;                 // { dg-bogus "" "" { xfail *-*-* } }