diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-12 09:21:45 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-12 09:21:45 +0000 |
commit | 3ab7b731173156a56b52c191c9917c5b0fbb6e42 (patch) | |
tree | ac6149fb379cf7becabcda2af17d30fd50cfe1fe /gcc/cp/pt.c | |
parent | 62d6df9a8334967dc12313f9dde4641c106a575b (diff) | |
download | gcc-3ab7b731173156a56b52c191c9917c5b0fbb6e42.tar.gz |
/cp
2013-11-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57734
* pt.c (lookup_template_class_1): Handle alias template declarations
of enumeration types.
/testsuite
2013-11-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57734
* g++.dg/cpp0x/alias-decl-enum-1.C: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204697 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8c1553feca2..d066c26dd88 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7458,30 +7458,7 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, context = global_namespace; /* Create the type. */ - if (TREE_CODE (template_type) == ENUMERAL_TYPE) - { - if (!is_dependent_type) - { - set_current_access_from_decl (TYPE_NAME (template_type)); - t = start_enum (TYPE_IDENTIFIER (template_type), NULL_TREE, - tsubst (ENUM_UNDERLYING_TYPE (template_type), - arglist, complain, in_decl), - SCOPED_ENUM_P (template_type), NULL); - } - else - { - /* We don't want to call start_enum for this type, since - the values for the enumeration constants may involve - template parameters. And, no one should be interested - in the enumeration constants for such a type. */ - t = cxx_make_type (ENUMERAL_TYPE); - SET_SCOPED_ENUM_P (t, SCOPED_ENUM_P (template_type)); - } - SET_OPAQUE_ENUM_P (t, OPAQUE_ENUM_P (template_type)); - ENUM_FIXED_UNDERLYING_TYPE_P (t) - = ENUM_FIXED_UNDERLYING_TYPE_P (template_type); - } - else if (DECL_ALIAS_TEMPLATE_P (gen_tmpl)) + if (DECL_ALIAS_TEMPLATE_P (gen_tmpl)) { /* The user referred to a specialization of an alias template represented by GEN_TMPL. @@ -7505,6 +7482,29 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, if (t == error_mark_node) return t; } + else if (TREE_CODE (template_type) == ENUMERAL_TYPE) + { + if (!is_dependent_type) + { + set_current_access_from_decl (TYPE_NAME (template_type)); + t = start_enum (TYPE_IDENTIFIER (template_type), NULL_TREE, + tsubst (ENUM_UNDERLYING_TYPE (template_type), + arglist, complain, in_decl), + SCOPED_ENUM_P (template_type), NULL); + } + else + { + /* We don't want to call start_enum for this type, since + the values for the enumeration constants may involve + template parameters. And, no one should be interested + in the enumeration constants for such a type. */ + t = cxx_make_type (ENUMERAL_TYPE); + SET_SCOPED_ENUM_P (t, SCOPED_ENUM_P (template_type)); + } + SET_OPAQUE_ENUM_P (t, OPAQUE_ENUM_P (template_type)); + ENUM_FIXED_UNDERLYING_TYPE_P (t) + = ENUM_FIXED_UNDERLYING_TYPE_P (template_type); + } else if (CLASS_TYPE_P (template_type)) { t = make_class_type (TREE_CODE (template_type)); @@ -7661,7 +7661,8 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, = tree_cons (arglist, t, DECL_TEMPLATE_INSTANTIATIONS (templ)); - if (TREE_CODE (template_type) == ENUMERAL_TYPE && !is_dependent_type) + if (TREE_CODE (template_type) == ENUMERAL_TYPE && !is_dependent_type + && !DECL_ALIAS_TEMPLATE_P (gen_tmpl)) /* Now that the type has been registered on the instantiations list, we set up the enumerators. Because the enumeration constants may involve the enumeration type itself, we make |