aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2002-01-31 17:52:11 -0500
committerJason Merrill <jason@gcc.gnu.org>2002-01-31 17:52:11 -0500
commita588fe25b7c357b4a84de452a757ab7fc5b8cb58 (patch)
treeedd430ad80c9fd93378d6bfbf1d4aafb1636bf1c /gcc
parente2f2e70a9415b3af44b62aa578a5640c11b5e4dd (diff)
downloadgcc-a588fe25b7c357b4a84de452a757ab7fc5b8cb58.zip
gcc-a588fe25b7c357b4a84de452a757ab7fc5b8cb58.tar.gz
gcc-a588fe25b7c357b4a84de452a757ab7fc5b8cb58.tar.bz2
re PR c++/3395 (Attribute causes type lookup to fail. Regression.)
PR c++/3395 * decl.c (xref_tag): Remember early attributes in TYPE_ATTRIBUTES, not TREE_TYPE. * semantics.c (finish_class_definition): Adjust. From-SVN: r49380
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/semantics.c4
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib2.C12
4 files changed, 20 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f259c96..c73ec06 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2002-01-31 Jason Merrill <jason@redhat.com>
+ PR c++/3395
+ * decl.c (xref_tag): Remember early attributes in TYPE_ATTRIBUTES,
+ not TREE_TYPE.
+ * semantics.c (finish_class_definition): Adjust.
+
Allow attributes in parms and casts.
* parse.y (named_parm): Don't strip attrs.
(declmods): Remove 'attributes' production.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e5d1a47..a5d9c64 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -12881,7 +12881,7 @@ xref_tag (code_type_node, name, globalize)
CLASSTYPE_DECLARED_CLASS (ref) = 0;
}
- TREE_TYPE (ref) = attributes;
+ TYPE_ATTRIBUTES (ref) = attributes;
return ref;
}
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 37729bf..603326c 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1891,8 +1891,8 @@ finish_class_definition (t, attributes, semi, pop_scope_p)
/* If we got any attributes in class_head, xref_tag will stick them in
TREE_TYPE of the type. Grab them now. */
- attributes = chainon (TREE_TYPE (t), attributes);
- TREE_TYPE (t) = NULL_TREE;
+ attributes = chainon (TYPE_ATTRIBUTES (t), attributes);
+ TYPE_ATTRIBUTES (t) = NULL_TREE;
if (TREE_CODE (t) == ENUMERAL_TYPE)
;
diff --git a/gcc/testsuite/g++.dg/ext/attrib2.C b/gcc/testsuite/g++.dg/ext/attrib2.C
new file mode 100644
index 0000000..a7563f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib2.C
@@ -0,0 +1,12 @@
+// Test that an early attribute doesn't confuse uses of a class.
+// { dg-do compile }
+
+struct __attribute__ ((packed)) A
+{
+ void f () const;
+};
+
+void
+A::f () const
+{
+}