diff options
-rw-r--r-- | gcc/cp/ChangeLog | 36 | ||||
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attrib25.C | 11 |
3 files changed, 37 insertions, 17 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1106f86..5737a62 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,27 +1,33 @@ +2006-08-11 Jason Merrill <jason@redhat.com> + + PR c++/28559 + * parser.c (cp_parser_elaborated_type_specifier): Also ignore + attributes applied to a TYPENAME_TYPE. + 2006-08-09 Lee Millward <lee.millward@codesourcery.com> - PR c++/28637 - * pt.c (coerce_template_parms): Copy across the - invalid template arguments to the new template inner arguments. - (retrieve_specialization): Robustify. + PR c++/28637 + * pt.c (coerce_template_parms): Copy across the + invalid template arguments to the new template inner arguments. + (retrieve_specialization): Robustify. - PR c++/28638 - * pt.c (coerce_template_template_parms): Robustify. + PR c++/28638 + * pt.c (coerce_template_template_parms): Robustify. - PR c++/28639 - * error.c (dump_template_parms): Robustify. + PR c++/28639 + * error.c (dump_template_parms): Robustify. - PR c++/28640 - * pt.c (redeclare_class_template): Robustify. + PR c++/28640 + * pt.c (redeclare_class_template): Robustify. - PR c++/28641 - * pt.c (type_unification_real): Robustify. + PR c++/28641 + * pt.c (type_unification_real): Robustify. 2006-08-03 Lee Millward <lee.millward@codesourcery.com> - PR c++/28347 - * decl.c (start_decl): Return error_mark_node if a - diagnostic was issed for an invalid typedef initialization. + PR c++/28347 + * decl.c (start_decl): Return error_mark_node if a + diagnostic was issed for an invalid typedef initialization. 2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index aa29787..35ce410 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10268,8 +10268,11 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, /* Allow attributes on forward declarations of classes. */ if (attributes) { - if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type) - && ! processing_explicit_instantiation) + if (TREE_CODE (type) == TYPENAME_TYPE) + warning (OPT_Wattributes, + "attributes ignored on uninstantiated type"); + else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type) + && ! processing_explicit_instantiation) warning (OPT_Wattributes, "attributes ignored on template instantiation"); else if (is_declaration && cp_parser_declares_only_class_p (parser)) diff --git a/gcc/testsuite/g++.dg/ext/attrib25.C b/gcc/testsuite/g++.dg/ext/attrib25.C new file mode 100644 index 0000000..aeffdff --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib25.C @@ -0,0 +1,11 @@ +// PR c++/28559 + +template<typename T> struct A +{ + struct B; +}; + +struct C +{ + template<typename T> friend struct __attribute__((packed)) A<T>::B; // { dg-warning "uninstantiated" } +}; |