aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog36
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib25.C11
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" }
+};