From 013143e015ea9a0a876b60b1143ca3b234f1aea3 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 20 Nov 2009 03:12:07 +0000 Subject: [PATCH] DR 176 permissiveness gcc/ * dwarf2out.c (get_context_die): Take TYPE_MAIN_VARIANT. gcc/cp/ * class.c (build_self_reference): Call set_underlying_type. * decl.c (check_elaborated_type_specifier): Don't complain about injected-class-name. (type_is_deprecated): Use TYPE_MAIN_VARIANT. * pt.c (convert_template_argument): Handle injected-class-name used as template template argument. * typeck2.c (abstract_virtuals_error): Use TYPE_MAIN_VARIANT. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154354 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/class.c | 1 + gcc/cp/decl.c | 5 +++++ gcc/cp/pt.c | 16 ++++++++++++++++ gcc/cp/typeck2.c | 1 + gcc/dwarf2out.c | 2 +- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/ext/injected-ttp.C | 15 +++++++++++++++ gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C | 2 +- gcc/testsuite/g++.old-deja/g++.pt/ttp41.C | 5 +++-- 11 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/injected-ttp.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8f6462414b1..b6cf53af8f8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2009-11-19 Jason Merrill + + * dwarf2out.c (get_context_die): Take TYPE_MAIN_VARIANT. + 2009-11-19 Basile Starynkevitch Rafael Avila de Espindola diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6a30b67bdfd..c25d360eaf0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,14 @@ 2009-11-19 Jason Merrill + DR 176 permissiveness + * class.c (build_self_reference): Call set_underlying_type. + * decl.c (check_elaborated_type_specifier): Don't complain about + injected-class-name. + (type_is_deprecated): Use TYPE_MAIN_VARIANT. + * pt.c (convert_template_argument): Handle injected-class-name used + as template template argument. + * typeck2.c (abstract_virtuals_error): Use TYPE_MAIN_VARIANT. + PR c++/561 * decl.c (static_fn_type): Split out... (revert_static_member_fn): ...from here. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 3cf15fb0fa6..38eb73f4004 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -6513,6 +6513,7 @@ build_self_reference (void) DECL_CONTEXT (value) = current_class_type; DECL_ARTIFICIAL (value) = 1; SET_DECL_SELF_REFERENCE_P (value); + set_underlying_type (value); if (processing_template_decl) value = push_template_decl (value); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 29e32c80624..7f5a688873b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9787,6 +9787,10 @@ type_is_deprecated (tree type) && TREE_DEPRECATED (TYPE_NAME (type))) return type; + /* Do warn about using typedefs to a deprecated class. */ + if (TAGGED_TYPE_P (type) && type != TYPE_MAIN_VARIANT (type)) + return type_is_deprecated (TYPE_MAIN_VARIANT (type)); + code = TREE_CODE (type); if (code == POINTER_TYPE || code == REFERENCE_TYPE @@ -10608,6 +10612,7 @@ check_elaborated_type_specifier (enum tag_types tag_code, elaborated type specifier is the implicit typedef created when the type is declared. */ else if (!DECL_IMPLICIT_TYPEDEF_P (decl) + && !DECL_SELF_REFERENCE_P (decl) && tag_code != typename_type) { error ("using typedef-name %qD after %qs", decl, tag_name (tag_code)); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9c82e3c19a5..c3b0f0e668f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5370,6 +5370,22 @@ convert_template_argument (tree parm, if (TREE_CODE (arg) == TYPE_PACK_EXPANSION) arg = PACK_EXPANSION_PATTERN (arg); + /* Deal with an injected-class-name used as a template template arg. */ + if (requires_tmpl_type && CLASS_TYPE_P (arg)) + { + tree t = maybe_get_template_decl_from_type_decl (TYPE_NAME (arg)); + if (TREE_CODE (t) == TEMPLATE_DECL) + { + if (complain & tf_warning_or_error) + pedwarn (input_location, OPT_pedantic, "injected-class-name %qD" + " used as template template argument", TYPE_NAME (arg)); + else if (flag_pedantic_errors) + t = arg; + + arg = t; + } + } + is_tmpl_type = ((TREE_CODE (arg) == TEMPLATE_DECL && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL) diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 6cb115202b2..a296caae26e 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -236,6 +236,7 @@ abstract_virtuals_error (tree decl, tree type) be abstract. */ if (!CLASS_TYPE_P (type)) return 0; + type = TYPE_MAIN_VARIANT (type); /* If the type is incomplete, we register it within a hash table, so that we can check again once it is completed. This makes sense diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 3db2092b4ee..0394114e1d6 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -19089,7 +19089,7 @@ get_context_die (tree context) { /* Find die that represents this context. */ if (TYPE_P (context)) - return force_type_die (context); + return force_type_die (TYPE_MAIN_VARIANT (context)); else return force_decl_die (context); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0a42693a3ec..5a56a9c5fbb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-11-19 Jason Merrill + + DR 176 permissiveness + * g++.dg/ext/injected-ttp.C: New. + * g++.old-deja/g++.pt/niklas01a.C: Adjust. + * g++.old-deja/g++.pt/ttp41.C: Adjust. + 2009-11-19 Andy Hutchinson * gcc.c-torture/compile/pr40204.c: Test only for int32 target. diff --git a/gcc/testsuite/g++.dg/ext/injected-ttp.C b/gcc/testsuite/g++.dg/ext/injected-ttp.C new file mode 100644 index 00000000000..405bee88cdf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/injected-ttp.C @@ -0,0 +1,15 @@ +// Test for doing the right thing with injected-class-name used as template +// type argument. This is an extension from DR 176. + +// { dg-options "-pedantic" } + +template +struct A { }; + +template