diff options
author | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-11-07 22:28:50 +0100 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-11-07 22:28:50 +0100 |
commit | 28704289327e4295928663b5bab7953718f71bc1 (patch) | |
tree | 2390bb8c86da49566597c517f894d572f55a9d35 /gcc/cp/decl2.c | |
parent | bfd08c89025e9b3f2d09ddf6a4555160cedb294f (diff) | |
download | gcc-28704289327e4295928663b5bab7953718f71bc1.zip gcc-28704289327e4295928663b5bab7953718f71bc1.tar.gz gcc-28704289327e4295928663b5bab7953718f71bc1.tar.bz2 |
PR c++/45114 - Support C++11 alias-declaration
gcc/cp/
* cp-tree.h (TYPE_DECL_ALIAS_P, TYPE_ALIAS_P)
(DECL_TYPE_TEMPLATE_P, DECL_ALIAS_TEMPLATE_P): New accessor
macros.
(TYPE_TEMPLATE_INFO): Get template info of an alias template
specializations from its TYPE_DECL.
(SET_TYPE_TEMPLATE_INFO): Set template info of alias template
specializations into its TYPE_DECL.
(DECL_CLASS_TEMPLATE_P): Re-write using the new
DECL_TYPE_TEMPLATE_P.
(enum cp_decl_spec): Add new ds_alias enumerator.
(alias_type_or_template_p, alias_template_specialization_p):
Declare new functions.
* parser.c (cp_parser_alias_declaration): New static function.
(cp_parser_check_decl_spec): Add "using" name for the `alias'
declspec.
(cp_parser_type_name): Update comment. Support simple-template-id
representing alias template specializations in c++0x mode.
(cp_parser_qualifying_entity): Update comment. Use
cp_parser_type_name.
(cp_parser_block_declaration): Handle alias-declaration in c++11.
Update comment.
(cp_parser_template_id): Handle specializations of alias
templates.
(cp_parser_member_declaration): Add alias-declaration production
to comment. Support alias-declarations.
(cp_parser_template_declaration_after_export): Handle alias
templates in c++11.
* decl.c (make_typename_type, make_unbound_class_template): Accept
alias templates.
(grokdeclarator): Set TYPE_DECL_ALIAS_P on alias
declarations.
* decl2.c (grokfield): Move template creation after setting up the
TYPE_DECL of the alias, so that the TEMPLATE_DECL of the alias
template actually carries the right type-id of the alias
declaration.
* pt.c (alias_type_or_template_p)
(alias_template_specialization_p): Define new public functions.
(maybe_process_partial_specialization): Reject partial
specializations of alias templates.
(primary_template_instantiation_p): Consider alias template
instantiations.
(push_template_decl_real): Assert that TYPE_DECLs of alias
templates are different from those of class template. Store
template info onto the TYPE_DECL of the alias template.
(convert_template_argument): Strip aliases from template
arguments.
(lookup_template_class_1): Handle the creation of the
specialization of an alias template.
(tsubst_decl): Create a substituted copy of the TYPE_DECL of an
member alias template.
(tsubst): Handle substituting into the type of an alias template.
Handle substituting UNBOUND_CLASS_TEMPLATE into
BOUND_TEMPLATE_TEMPLATE_PARM.
(do_type_instantiation): Better diagnostics when trying to
explicitely instantiate a non-class template.
* search.c (lookup_field_1, lookup_field_r): Support looking up
alias templates.
* semantics.c (finish_template_type): For instantiations of alias
templates, return the TYPE_DECL of the actual alias and not the
one of the aliased type.
* error.c (dump_alias_template_specialization): New static
function.
(dump_type): Handle printing of alias templates and their
specializations. templates.
(dump_aggr_type): For specialization of alias templates, fetch
arguments from the right place.
(dump_decl): Print an alias-declaration like `using decl = type;'
(dump_template_decl): Support printing of alias templates.
gcc/testsuite/
* g++.dg/cpp0x/alias-decl-0.C: New test case.
* g++.dg/cpp0x/alias-decl-1.C: Likewise.
* g++.dg/cpp0x/alias-decl-3.C: Likewise.
* g++.dg/cpp0x/alias-decl-4.C: Likewise.
* g++.dg/cpp0x/alias-decl-6.C: Likewise.
* g++.dg/cpp0x/alias-decl-7.C: Likewise.
* g++.dg/cpp0x/alias-decl-8.C: Likewise.
* g++.dg/cpp0x/alias-decl-9.C: Likewise.
* g++.dg/cpp0x/alias-decl-10.C: Likewise.
* g++.dg/ext/alias-decl-attr1.C: Likewise.
* g++.dg/ext/alias-decl-attr2.C: Likewise.
* g++.dg/ext/alias-decl-attr3.C: Likewise.
* g++.dg/ext/alias-decl-attr4.C: Likewise.
From-SVN: r181118
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r-- | gcc/cp/decl2.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 17be3ad..3dc5a69 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -848,9 +848,6 @@ grokfield (const cp_declarator *declarator, DECL_NONLOCAL (value) = 1; DECL_CONTEXT (value) = current_class_type; - if (processing_template_decl) - value = push_template_decl (value); - if (attrlist) { int attrflags = 0; @@ -869,6 +866,12 @@ grokfield (const cp_declarator *declarator, && TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (value))) != value) set_underlying_type (value); + /* It's important that push_template_decl below follows + set_underlying_type above so that the created template + carries the properly set type of VALUE. */ + if (processing_template_decl) + value = push_template_decl (value); + record_locally_defined_typedef (value); return value; } |