+2016-07-28 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/71665
+ * decl.c (build_enumerator): Check the type of the enumerator before
+ calling cxx_constant_value.
+
2016-07-27 Jason Merrill <jason@redhat.com>
PR c++/71747
if (value != NULL_TREE)
{
- value = cxx_constant_value (value);
-
- if (TREE_CODE (value) != INTEGER_CST
- || ! INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (value)))
+ if (! INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P
+ (TREE_TYPE (value)))
{
- error ("enumerator value for %qD is not an integer constant",
- name);
+ error ("enumerator for %qD must have integral or "
+ "unscoped enumeration type", name);
value = NULL_TREE;
}
+ else
+ {
+ value = cxx_constant_value (value);
+
+ if (TREE_CODE (value) != INTEGER_CST)
+ {
+ error ("enumerator value for %qD is not an integer "
+ "constant", name);
+ value = NULL_TREE;
+ }
+ }
}
}
+2016-07-28 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/71665
+ * g++.dg/cpp0x/pr71665-1.C: New.
+ * g++.dg/cpp0x/pr71665-2.C: Likewise.
+ * g++.dg/cpp0x/enum29.C: Adjust dg-error string.
+ * g++.dg/ext/label10.C: Likewise.
+ * g++.dg/parse/constant5.C: Likewise.
+
2016-07-28 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/71859
enum E1 { e1 = X1() };
enum E2 { e2 = X2() };
enum E3 { e3 = X3() };
-enum E4 { e4 = X4() }; // { dg-error "integer constant" }
+enum E4 { e4 = X4() }; // { dg-error "integral" }
enum E5 { e5 = X5() }; // { dg-error "ambiguous" }
enum F0 : int { f0 = X0() };
--- /dev/null
+// PR c++/71665
+// { dg-do compile { target c++11 } }
+
+class A
+{
+ int f ();
+ enum { a = f }; // { dg-error "enumerator" }
+};
--- /dev/null
+// PR c++/71665
+// { dg-do compile { target c++11 } }
+
+class A
+{
+ enum class E { e = 1 };
+ enum { a = E::e }; // { dg-error "integral or unscoped enumeration" }
+};
template<int N> struct A
{
- enum { M = && N }; // { dg-error "referenced outside|cannot appear in|not an integer constant" }
+ enum { M = && N }; // { dg-error "referenced outside|cannot appear in|integral" }
};
A<0> a;
void foo ()
{
__label__ P;
- enum { O = && P }; // { dg-error "cannot appear in|not an integer constant" }
+ enum { O = && P }; // { dg-error "cannot appear in|integral" }
P:;
}
// { dg-options "-std=c++98 -pedantic-errors" }
enum E {
- a = 24.2, // { dg-error "constant" }
+ a = 24.2, // { dg-error "integral|constant" }
b = (int)3.7,
c = int(4.2),
d = (int)(4.2 + 3.7), // { dg-error "constant" }