Hi,

we fixed c++/58647 with:

9672     case COMPONENT_REF:
9673       if (is_overloaded_fn (t))
9674         {
9675           /* We can only get here in checking mode via
9676              build_non_dependent_expr,  because any expression that
9677              calls or takes the address of the function will have
9678              pulled a FUNCTION_DECL out of the COMPONENT_REF.  */
9679           gcc_checking_assert (allow_non_constant);
9680           *non_constant_p = true;
9681           return t;
9682         }


which also added a gcc_checking_assert. In the new issue the assert triggers during error recovery and I guess we can simply loosen it a bit with || errorcount, the below passes testing.

Thanks,
Paolo.

//////////////////////

/cp
2014-02-18  Paolo Carlini  <paolo.carl...@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.carl...@oracle.com>

        PR c++/60215
        * g++.dg/cpp0x/pr60215.C: New.
Index: cp/semantics.c
===================================================================
--- cp/semantics.c      (revision 207837)
+++ cp/semantics.c      (working copy)
@@ -9676,7 +9677,7 @@ cxx_eval_constant_expression (const constexpr_call
             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: testsuite/g++.dg/cpp0x/pr60215.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr60215.C    (revision 0)
+++ testsuite/g++.dg/cpp0x/pr60215.C    (working copy)
@@ -0,0 +1,8 @@
+// PR c++/60215
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+  void foo();
+  int i : foo;  // { dg-error "width" }
+};

Reply via email to