+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
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;
}
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");
+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>
--- /dev/null
+// PR c++/14821
+
+namespace A {
+ namespace B {}
+}
+
+namespace A {
+ namespace Alias = ::A::B;
+}
+
+namespace A {
+ namespace Alias = ::A::B;
+}
--- /dev/null
+// 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 "" }