2018-06-15 Jason Merrill <jason@redhat.com>
+ * decl.c (start_enum): Do compare dependent underlying type.
+
PR c++/82882 - ICE with lambda in template default argument.
* lambda.c (record_null_lambda_scope): New.
* pt.c (tsubst_lambda_expr): Use it.
enumtype = error_mark_node;
}
else if (underlying_type && ENUM_UNDERLYING_TYPE (enumtype)
- && !dependent_type_p (underlying_type)
- && !dependent_type_p (ENUM_UNDERLYING_TYPE (enumtype))
&& !same_type_p (underlying_type,
ENUM_UNDERLYING_TYPE (enumtype)))
{
/* enumtype may be an ENUMERAL_TYPE if this is a redefinition
of an opaque enum, or an opaque enum of an already defined
- enumeration (C++0x only).
+ enumeration (C++11).
In any other case, it'll be NULL_TREE. */
if (!enumtype)
{
}
prevtype = enumtype;
- /* Do not push the decl more than once, unless we need to
- compare underlying types at instantiation time */
+ /* Do not push the decl more than once. */
if (!enumtype
- || TREE_CODE (enumtype) != ENUMERAL_TYPE
- || (underlying_type
- && dependent_type_p (underlying_type))
- || (ENUM_UNDERLYING_TYPE (enumtype)
- && dependent_type_p (ENUM_UNDERLYING_TYPE (enumtype))))
+ || TREE_CODE (enumtype) != ENUMERAL_TYPE)
{
enumtype = cxx_make_type (ENUMERAL_TYPE);
enumtype = pushtag (name, enumtype, /*tag_scope=*/ts_current);
of an if or switch statement. */
sk_function_parms, /* The scope containing function parameters. */
sk_class, /* The scope containing the members of a class. */
- sk_scoped_enum, /* The scope containing the enumertors of a C++0x
+ sk_scoped_enum, /* The scope containing the enumerators of a C++11
scoped enumeration. */
sk_namespace, /* The scope containing the members of a
namespace, including the global scope. */
enum E : T; // { dg-message "previous definition" }
enum E : int; // { dg-error "different underlying type" }
};
-template struct S1<short>; // { dg-message "required from here" }
+template struct S1<short>;
template<typename T> struct S2
{
template<typename T1, typename T2> struct S3
{
- enum E : T1;
- enum E : T2;
+ enum E : T1; // { dg-message "previous definition" }
+ enum E : T2; // { dg-error "different underlying type" }
};
template struct S3<short,short>;
enum E : T1; // { dg-message "previous definition" }
enum E : T2; // { dg-error "different underlying type" }
};
-template struct S4<short,char>; // { dg-message "required from here" }
+template struct S4<short,char>;
template<typename T> struct S1
{
enum E1 : int;
- enum E1 : T;
- enum class E2 : int;
enum class E2 : T;
};
// { dg-do compile { target c++11 } }
-//This instatiation is ok
template<typename T> struct S1
{
- enum E : int;
- enum E : T;
+ enum E : int; // { dg-message "previous definition" }
+ enum E : T; // { dg-error "different underlying type" }
};
template struct S1<int>; //ok
-//This error is diagnosed at instantiation time
template<typename T> struct S2
{
enum E : int; // { dg-message "previous definition" }
enum E : T; // { dg-error "different underlying type" }
};
-template struct S2<short>; // { dg-message "required from here" }
+template struct S2<short>;
-//This error is diagnosed at compilation time
template<typename T> struct S3
{
enum E : int; // { dg-message "previous definition" }