mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-12 02:19:56 +08:00
re PR c++/14821 (Duplicate namespace alias declaration should not conflict)
PR c++/14821 * 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. From-SVN: r82170
This commit is contained in:
parent
3972995b19
commit
f746161e4f
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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>
|
||||
|
||||
|
13
gcc/testsuite/g++.dg/other/ns1.C
Normal file
13
gcc/testsuite/g++.dg/other/ns1.C
Normal file
@ -0,0 +1,13 @@
|
||||
// PR c++/14821
|
||||
|
||||
namespace A {
|
||||
namespace B {}
|
||||
}
|
||||
|
||||
namespace A {
|
||||
namespace Alias = ::A::B;
|
||||
}
|
||||
|
||||
namespace A {
|
||||
namespace Alias = ::A::B;
|
||||
}
|
7
gcc/testsuite/g++.dg/template/invalid1.C
Normal file
7
gcc/testsuite/g++.dg/template/invalid1.C
Normal file
@ -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 "" }
|
Loading…
Reference in New Issue
Block a user