===================================================================
@@ -4996,18 +4996,22 @@ check_array_designated_initializer (constructor_el
return false;
}
- ce->index = cxx_constant_value (ce->index);
-
- if (TREE_CODE (ce->index) == INTEGER_CST)
+ tree ce_index = build_expr_type_conversion (WANT_INT | WANT_ENUM,
+ ce->index, true);
+ if (ce_index
+ && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (ce_index))
+ && (TREE_CODE (ce_index = maybe_constant_value (ce_index))
+ == INTEGER_CST))
{
/* A C99 designator is OK if it matches the current index. */
- if (wi::eq_p (ce->index, index))
+ if (wi::eq_p (ce_index, index))
return true;
else
sorry ("non-trivial designated initializers not supported");
}
else
- gcc_unreachable ();
+ error ("C99 designator %qE is not an integral constant-expression",
+ ce->index);
return false;
}
===================================================================
@@ -0,0 +1,27 @@
+// PR c++/58882
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr operator int() const { return 0; }
+};
+
+int a[] = { [A()] = 0 };
+
+enum E { e0 };
+
+struct B
+{
+ constexpr operator E() const { return E::e0; }
+};
+
+int b[] = { [B()] = 0 };
+
+enum class SE { se0 };
+
+struct C
+{
+ constexpr operator SE() const { return SE::se0; }
+};
+
+int c[] = { [C()] = 0 }; // { dg-error "integral constant-expression" }
===================================================================
@@ -0,0 +1,3 @@
+// PR c++/58882
+
+int a[] = { [0.] = 0 }; // { dg-error "integral constant-expression" }