aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-03-12 07:23:15 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-03-12 07:23:15 +0000
commit2601a4ee73c810742e09d7c4dacaf52107724a05 (patch)
tree9d2487b8fa851f63c3e54366226f651952dcfcfa /gcc
parent21282b1e9210c0df065ef4bb38a7cfbaa2c47d06 (diff)
downloadgcc-2601a4ee73c810742e09d7c4dacaf52107724a05.zip
gcc-2601a4ee73c810742e09d7c4dacaf52107724a05.tar.gz
gcc-2601a4ee73c810742e09d7c4dacaf52107724a05.tar.bz2
re PR c++/9336 (ICE in cp_line_of, at cp/error.c:2191)
PR c++/9336 * g++.dg/parse/namespace8.C: New test. PR c++/9336 * decl2.c (do_nonmember_using_decl): Do not call duplicate decls to merge old and new declarations. From-SVN: r64216
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/decl2.c14
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace8.C6
4 files changed, 23 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a8788f2..a45fc53 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2003-03-11 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/9336
+ * decl2.c (do_nonmember_using_decl): Do not call duplicate decls
+ to merge old and new declarations.
+
2003-03-12 Alexandre Oliva <aoliva@redhat.com>
* g++.1: Remove.
@@ -8,6 +14,10 @@
2003-03-11 Mark Mitchell <mark@codesourcery.com>
+ PR c++/9336
+ * decl2.c (do_nonmember_using_decl): Do not call duplicate decls
+ to merge old and new declarations.
+
PR c++/9924
* decl2.c (do_nonmember_using_decl): Ignore anticipated builtins.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index b96f65f..b4654c9 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4222,12 +4222,6 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
{
tree tmp, tmp1;
- if (oldval && !is_overloaded_fn (oldval))
- {
- duplicate_decls (OVL_CURRENT (BINDING_VALUE (decls)), oldval);
- oldval = NULL_TREE;
- }
-
*newval = oldval;
for (tmp = BINDING_VALUE (decls); tmp; tmp = OVL_NEXT (tmp))
{
@@ -4290,12 +4284,12 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
else
{
*newval = BINDING_VALUE (decls);
- if (oldval)
- duplicate_decls (*newval, oldval);
- }
+ if (oldval && !decls_match (*newval, oldval))
+ error ("`%D' is already declared in this scope", name);
+ }
*newtype = BINDING_TYPE (decls);
- if (oldtype && *newtype && oldtype != *newtype)
+ if (oldtype && *newtype && !same_type_p (oldtype, *newtype))
{
error ("using declaration `%D' introduced ambiguous type `%T'",
name, oldtype);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8cd81af..637bdac 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2003-03-11 Mark Mitchell <mark@codesourcery.com>
+ PR c++/9336
+ * g++.dg/parse/namespace8.C: New test.
+
PR c++/9924
* g++.dg/overload/builtin2.C: New test.
diff --git a/gcc/testsuite/g++.dg/parse/namespace8.C b/gcc/testsuite/g++.dg/parse/namespace8.C
new file mode 100644
index 0000000..d5a9b0a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace8.C
@@ -0,0 +1,6 @@
+namespace X {
+ typedef struct {
+ } x;
+}
+typedef X::x x;
+using X::x;