Commit b4cf2e42 by Jason Merrill Committed by Jason Merrill

* decl.c (start_enum): Do compare dependent underlying type.

From-SVN: r261655
parent 582f844c
2018-06-15 Jason Merrill <jason@redhat.com> 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. PR c++/82882 - ICE with lambda in template default argument.
* lambda.c (record_null_lambda_scope): New. * lambda.c (record_null_lambda_scope): New.
* pt.c (tsubst_lambda_expr): Use it. * pt.c (tsubst_lambda_expr): Use it.
......
...@@ -14131,8 +14131,6 @@ start_enum (tree name, tree enumtype, tree underlying_type, ...@@ -14131,8 +14131,6 @@ start_enum (tree name, tree enumtype, tree underlying_type,
enumtype = error_mark_node; enumtype = error_mark_node;
} }
else if (underlying_type && ENUM_UNDERLYING_TYPE (enumtype) 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, && !same_type_p (underlying_type,
ENUM_UNDERLYING_TYPE (enumtype))) ENUM_UNDERLYING_TYPE (enumtype)))
{ {
...@@ -14157,7 +14155,7 @@ start_enum (tree name, tree enumtype, tree underlying_type, ...@@ -14157,7 +14155,7 @@ start_enum (tree name, tree enumtype, tree underlying_type,
/* enumtype may be an ENUMERAL_TYPE if this is a redefinition /* enumtype may be an ENUMERAL_TYPE if this is a redefinition
of an opaque enum, or an opaque enum of an already defined 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. */ In any other case, it'll be NULL_TREE. */
if (!enumtype) if (!enumtype)
{ {
...@@ -14166,14 +14164,9 @@ start_enum (tree name, tree enumtype, tree underlying_type, ...@@ -14166,14 +14164,9 @@ start_enum (tree name, tree enumtype, tree underlying_type,
} }
prevtype = enumtype; prevtype = enumtype;
/* Do not push the decl more than once, unless we need to /* Do not push the decl more than once. */
compare underlying types at instantiation time */
if (!enumtype if (!enumtype
|| TREE_CODE (enumtype) != ENUMERAL_TYPE || TREE_CODE (enumtype) != ENUMERAL_TYPE)
|| (underlying_type
&& dependent_type_p (underlying_type))
|| (ENUM_UNDERLYING_TYPE (enumtype)
&& dependent_type_p (ENUM_UNDERLYING_TYPE (enumtype))))
{ {
enumtype = cxx_make_type (ENUMERAL_TYPE); enumtype = cxx_make_type (ENUMERAL_TYPE);
enumtype = pushtag (name, enumtype, /*tag_scope=*/ts_current); enumtype = pushtag (name, enumtype, /*tag_scope=*/ts_current);
......
...@@ -112,7 +112,7 @@ enum scope_kind { ...@@ -112,7 +112,7 @@ enum scope_kind {
of an if or switch statement. */ of an if or switch statement. */
sk_function_parms, /* The scope containing function parameters. */ sk_function_parms, /* The scope containing function parameters. */
sk_class, /* The scope containing the members of a class. */ 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. */ scoped enumeration. */
sk_namespace, /* The scope containing the members of a sk_namespace, /* The scope containing the members of a
namespace, including the global scope. */ namespace, including the global scope. */
......
...@@ -6,7 +6,7 @@ template<typename T> struct S1 ...@@ -6,7 +6,7 @@ template<typename T> struct S1
enum E : T; // { dg-message "previous definition" } enum E : T; // { dg-message "previous definition" }
enum E : int; // { dg-error "different underlying type" } 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 T> struct S2
{ {
...@@ -17,8 +17,8 @@ template struct S2<short>; ...@@ -17,8 +17,8 @@ template struct S2<short>;
template<typename T1, typename T2> struct S3 template<typename T1, typename T2> struct S3
{ {
enum E : T1; enum E : T1; // { dg-message "previous definition" }
enum E : T2; enum E : T2; // { dg-error "different underlying type" }
}; };
template struct S3<short,short>; template struct S3<short,short>;
...@@ -27,4 +27,4 @@ template<typename T1, typename T2> struct S4 ...@@ -27,4 +27,4 @@ template<typename T1, typename T2> struct S4
enum E : T1; // { dg-message "previous definition" } enum E : T1; // { dg-message "previous definition" }
enum E : T2; // { dg-error "different underlying type" } enum E : T2; // { dg-error "different underlying type" }
}; };
template struct S4<short,char>; // { dg-message "required from here" } template struct S4<short,char>;
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
template<typename T> struct S1 template<typename T> struct S1
{ {
enum E1 : int; enum E1 : int;
enum E1 : T;
enum class E2 : int;
enum class E2 : T; enum class E2 : T;
}; };
......
// { dg-do compile { target c++11 } } // { dg-do compile { target c++11 } }
//This instatiation is ok
template<typename T> struct S1 template<typename T> struct S1
{ {
enum E : int; enum E : int; // { dg-message "previous definition" }
enum E : T; enum E : T; // { dg-error "different underlying type" }
}; };
template struct S1<int>; //ok template struct S1<int>; //ok
//This error is diagnosed at instantiation time
template<typename T> struct S2 template<typename T> struct S2
{ {
enum E : int; // { dg-message "previous definition" } enum E : int; // { dg-message "previous definition" }
enum E : T; // { dg-error "different underlying type" } 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 template<typename T> struct S3
{ {
enum E : int; // { dg-message "previous definition" } enum E : int; // { dg-message "previous definition" }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment