OSDN Git Service

PR c++/14821
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 May 2004 17:56:26 +0000 (17:56 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 May 2004 17:56:26 +0000 (17:56 +0000)
* name-lookup.c (supplement_binding): Allow redefinitions of
namespace aliases.

PR c++/14883
* parser.c (cp_parser_template_argument): Robustify.

PR c++/14821
* g++.dg/other/ns1.C: New test.

PR c++/14883
* g++.dg/template/invalid1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82170 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/ns1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/invalid1.C [new file with mode: 0644]

index 3878c7e..e6a6524 100644 (file)
@@ -1,3 +1,12 @@
+2004-05-23  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/14821
+       * name-lookup.c (supplement_binding): Allow redefinitions of
+       namespace aliases.
+
+       PR c++/14883
+       * parser.c (cp_parser_template_argument): Robustify.
+
 2004-05-23  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * class.c (alter_access): Use %E format specifier to print an
index 3888834..ad8003d 100644 (file)
@@ -503,11 +503,22 @@ supplement_binding (cxx_binding *binding, tree decl)
       duplicate_decls (decl, binding->value);
       ok = false;
     }
+  else if (TREE_CODE (decl) == NAMESPACE_DECL
+          && TREE_CODE (bval) == NAMESPACE_DECL
+          && DECL_NAMESPACE_ALIAS (decl)
+          && DECL_NAMESPACE_ALIAS (bval)
+          && ORIGINAL_NAMESPACE (bval) == ORIGINAL_NAMESPACE (decl))
+    /* [namespace.alias]
+       
+      In a declarative region, a namespace-alias-definition can be
+      used to redefine a namespace-alias declared in that declarative
+      region to refer only to the namespace to which it already
+      refers.  */
+    ok = false;
   else
     {
       error ("declaration of `%#D'", decl);
-      cp_error_at ("conflicts with previous declaration `%#D'",
-                  binding->value);
+      cp_error_at ("conflicts with previous declaration `%#D'", bval);
       ok = false;
     }
 
index d26061f..59ef23f 100644 (file)
@@ -8417,12 +8417,16 @@ cp_parser_template_argument (cp_parser* parser)
     cp_parser_error (parser, "expected template-argument");
   if (!cp_parser_error_occurred (parser))
     {
-      /* Figure out what is being referred to.  */
-      argument = cp_parser_lookup_name (parser, argument,
-                                       /*is_type=*/false,
-                                       /*is_template=*/template_p,
-                                       /*is_namespace=*/false,
-                                       /*check_dependency=*/true);
+      /* Figure out what is being referred to.  If the id-expression
+        was for a class template specialization, then we will have a
+        TYPE_DECL at this point.  There is no need to do name lookup
+        at this point in that case.  */
+      if (TREE_CODE (argument) != TYPE_DECL)
+       argument = cp_parser_lookup_name (parser, argument,
+                                         /*is_type=*/false,
+                                         /*is_template=*/template_p,
+                                         /*is_namespace=*/false,
+                                         /*check_dependency=*/true);
       if (TREE_CODE (argument) != TEMPLATE_DECL
          && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
        cp_parser_error (parser, "expected template-name");
index 5feef48..d93b5c9 100644 (file)
@@ -1,3 +1,11 @@
+2004-05-23  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/14821
+       * g++.dg/other/ns1.C: New test.
+
+       PR c++/14883
+       * g++.dg/template/invalid1.C: New test.
+
 2004-05-23  Paul Brook  <paul@codesourcery.com>
        Victor Leikehman  <lei@haifasphere.co.il>
 
diff --git a/gcc/testsuite/g++.dg/other/ns1.C b/gcc/testsuite/g++.dg/other/ns1.C
new file mode 100644 (file)
index 0000000..cb77780
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/14821
+
+namespace A {
+  namespace B {}
+}
+
+namespace A {
+  namespace Alias = ::A::B;
+}
+
+namespace A {
+  namespace Alias = ::A::B;
+}
diff --git a/gcc/testsuite/g++.dg/template/invalid1.C b/gcc/testsuite/g++.dg/template/invalid1.C
new file mode 100644 (file)
index 0000000..04b8710
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/14883
+
+template < class T > struct DomainTraits {};
+template < int Dim > class Interval;
+template < class DT > class Domain {};
+template <> class Interval < 1 >:public Domain < DomainTraits < Interval < 1 >
+>> {}; // { dg-error "" }