aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2000-11-28 10:31:09 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2000-11-28 10:31:09 +0000
commitbb92901dc0ff3fbdb21532566a4f46d197fd55e6 (patch)
tree6d5658cba4a32592b02ffd5c3b7cf207e789b6be
parent2f3608c33e4b7787fb460981463958df9caf387e (diff)
downloadgcc-bb92901dc0ff3fbdb21532566a4f46d197fd55e6.zip
gcc-bb92901dc0ff3fbdb21532566a4f46d197fd55e6.tar.gz
gcc-bb92901dc0ff3fbdb21532566a4f46d197fd55e6.tar.bz2
parse.y (base_class.1): Produce a _TYPE not a _DECL.
cp: * parse.y (base_class.1): Produce a _TYPE not a _DECL. * semantics.c (finish_base_specifier): Accept a _TYPE not a _DECL. testsuite: * g++.old-deja/g++.other/base1.C: New test. From-SVN: r37817
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parse.y9
-rw-r--r--gcc/cp/semantics.c20
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/base1.C20
5 files changed, 42 insertions, 17 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9d486f6..e0c7548 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
2000-11-28 Nathan Sidwell <nathan@codesourcery.com>
+ * parse.y (base_class.1): Produce a _TYPE not a _DECL.
+ * semantics.c (finish_base_specifier): Accept a _TYPE not a
+ _DECL.
+
+2000-11-28 Nathan Sidwell <nathan@codesourcery.com>
+
* spew.c (yyerror): Cope if yylval.ttype is NULL.
2000-11-28 Nathan Sidwell <nathan@codesourcery.com>
diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y
index 9e32911..4c03dc7 100644
--- a/gcc/cp/parse.y
+++ b/gcc/cp/parse.y
@@ -2460,13 +2460,10 @@ base_class:
base_class.1:
typename_sub
- { if ($$ == error_mark_node)
- ;
- else if (!TYPE_P ($$))
- $$ = error_mark_node;
- else
- $$ = TYPE_MAIN_DECL ($1); }
+ { if (!TYPE_P ($$))
+ $$ = error_mark_node; }
| nonnested_type
+ { $$ = TREE_TYPE ($$); }
;
base_class_access_list:
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 8d22ce2..8502eef 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -2068,21 +2068,19 @@ finish_base_specifier (access_specifier, base_class)
tree access_specifier;
tree base_class;
{
- tree type;
tree result;
- if (base_class == NULL_TREE)
- {
- error ("invalid base class");
- type = error_mark_node;
- }
- else
- type = TREE_TYPE (base_class);
-
- if (! is_aggr_type (type, 1))
+ if (! is_aggr_type (base_class, 1))
result = NULL_TREE;
else
- result = build_tree_list (access_specifier, type);
+ {
+ if (CP_TYPE_QUALS (base_class) != 0)
+ {
+ cp_error ("base class `%T' has cv qualifiers", base_class);
+ base_class = TYPE_MAIN_VARIANT (base_class);
+ }
+ result = build_tree_list (access_specifier, base_class);
+ }
return result;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 06f689b..f60af3f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2000-11-28 Nathan Sidwell <nathan@codesourcery.com>
+ * g++.old-deja/g++.other/base1.C: New test.
+
+2000-11-28 Nathan Sidwell <nathan@codesourcery.com>
+
* g++.old-deja/g++.other/parse2.C: New test.
2000-11-28 Nathan Sidwell <nathan@codesourcery.com>
diff --git a/gcc/testsuite/g++.old-deja/g++.other/base1.C b/gcc/testsuite/g++.old-deja/g++.other/base1.C
new file mode 100644
index 0000000..ace821c
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/base1.C
@@ -0,0 +1,20 @@
+// Build don't link:
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 25 Nov 2000 <nathan@codesourcery.com>
+
+// We lost information about which base wasn't an aggregate type, plus we
+// allowed cv qualifed bases via typedefs.
+
+typedef int I;
+typedef int cI;
+
+struct A {};
+
+typedef const A cA;
+typedef A pA;
+
+struct B : I {}; // ERROR - not an aggregate
+struct C : cI {}; // ERROR - not an aggregate
+struct D : cA {}; // ERROR - cv qualified
+struct E : pA {};