]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/60225 ([c++11] ICE initializing constexpr array)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 18 Feb 2014 23:11:26 +0000 (23:11 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 18 Feb 2014 23:11:26 +0000 (23:11 +0000)
/cp
2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60225
* semantics.c (ensure_literal_type_for_constexpr_object): Use
strip_array_types.

/testsuite
2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60225
* g++.dg/cpp0x/constexpr-ice10.C: New.

/cp
2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60215
* semantics.c (cxx_eval_constant_expression, [COMPONENT_REF]):
During error recovery allow_non_constant may be false.

/testsuite
2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60215
* g++.dg/cpp0x/pr60215.C: New.

From-SVN: r207858

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

index e29e9dd0f3955339762d787979599fa542047901..878ba4a2829ebe1b21185b9411c52875ffbe8a82 100644 (file)
@@ -1,3 +1,15 @@
+2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60225
+       * semantics.c (ensure_literal_type_for_constexpr_object): Use
+       strip_array_types.
+
+2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60215
+       * semantics.c (cxx_eval_constant_expression, [COMPONENT_REF]):
+       During error recovery allow_non_constant may be false.
+
 2014-02-18  Adam Butcher  <adam@jessamine.co.uk>
 
        PR c++/60190
index 9fb4fc0c692dbe68e6c9e49f7203fc77ace06e06..eb1c44ee1f3ec9e5e4ac58621f8b7ba75643050e 100644 (file)
@@ -7380,7 +7380,8 @@ ensure_literal_type_for_constexpr_object (tree decl)
   if (VAR_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl)
       && !processing_template_decl)
     {
-      if (CLASS_TYPE_P (type) && !COMPLETE_TYPE_P (complete_type (type)))
+      tree stype = strip_array_types (type);
+      if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype)))
        /* Don't complain here, we'll complain about incompleteness
           when we try to initialize the variable.  */;
       else if (!literal_type_p (type))
@@ -9676,7 +9677,7 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t,
             build_non_dependent_expr,  because any expression that
             calls or takes the address of the function will have
             pulled a FUNCTION_DECL out of the COMPONENT_REF.  */
-         gcc_checking_assert (allow_non_constant);
+         gcc_checking_assert (allow_non_constant || errorcount);
          *non_constant_p = true;
          return t;
        }
index 855b0c2bc0ffb2559e8947652296bdc5c963b064..6ca256022a5e36ee409c393d07d7f1766846b42e 100644 (file)
@@ -1,3 +1,13 @@
+2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60225
+       * g++.dg/cpp0x/constexpr-ice10.C: New.
+
+2014-02-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60215
+       * g++.dg/cpp0x/pr60215.C: New.
+
 2014-02-18  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/49397
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C
new file mode 100644 (file)
index 0000000..f6fc80c
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/60225
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+  constexpr A() {}
+  static constexpr A a[2] = {};  // { dg-error "incomplete" }
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr60215.C b/gcc/testsuite/g++.dg/cpp0x/pr60215.C
new file mode 100644 (file)
index 0000000..2970017
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/60215
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+  void foo();
+  int i : foo;  // { dg-error "width" }
+};