c++: Bogus error using namespace alias [PR91826]
My changes to is_nested_namespace broke is_ancestor's use where a namespace alias might be passed in. This changes is_ancestor to look through the alias. PR c++/91826 * name-lookup.c (is_ancestor): Allow CHILD to be a namespace alias.
This commit is contained in:
parent
f261388f1a
commit
feaa1640b3
|
@ -1,3 +1,8 @@
|
|||
2020-01-27 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
PR c++/91826
|
||||
* name-lookup.c (is_ancestor): Allow CHILD to be a namespace alias.
|
||||
|
||||
2020-01-26 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/90992
|
||||
|
|
|
@ -4012,38 +4012,46 @@ is_nested_namespace (tree ancestor, tree descendant, bool inline_only)
|
|||
return ancestor == descendant;
|
||||
}
|
||||
|
||||
/* Returns true if ROOT (a namespace, class, or function) encloses
|
||||
CHILD. CHILD may be either a class type or a namespace. */
|
||||
/* Returns true if ROOT (a non-alias namespace, class, or function)
|
||||
encloses CHILD. CHILD may be either a class type or a namespace
|
||||
(maybe alias). */
|
||||
|
||||
bool
|
||||
is_ancestor (tree root, tree child)
|
||||
{
|
||||
gcc_assert ((TREE_CODE (root) == NAMESPACE_DECL
|
||||
|| TREE_CODE (root) == FUNCTION_DECL
|
||||
|| CLASS_TYPE_P (root)));
|
||||
gcc_assert ((TREE_CODE (child) == NAMESPACE_DECL
|
||||
|| CLASS_TYPE_P (child)));
|
||||
gcc_checking_assert ((TREE_CODE (root) == NAMESPACE_DECL
|
||||
&& !DECL_NAMESPACE_ALIAS (root))
|
||||
|| TREE_CODE (root) == FUNCTION_DECL
|
||||
|| CLASS_TYPE_P (root));
|
||||
gcc_checking_assert (TREE_CODE (child) == NAMESPACE_DECL
|
||||
|| CLASS_TYPE_P (child));
|
||||
|
||||
/* The global namespace encloses everything. */
|
||||
/* The global namespace encloses everything. Early-out for the
|
||||
common case. */
|
||||
if (root == global_namespace)
|
||||
return true;
|
||||
|
||||
/* Search until we reach namespace scope. */
|
||||
/* Search CHILD until we reach namespace scope. */
|
||||
while (TREE_CODE (child) != NAMESPACE_DECL)
|
||||
{
|
||||
/* If we've reached the ROOT, it encloses CHILD. */
|
||||
if (root == child)
|
||||
return true;
|
||||
|
||||
/* Go out one level. */
|
||||
if (TYPE_P (child))
|
||||
child = TYPE_NAME (child);
|
||||
child = CP_DECL_CONTEXT (child);
|
||||
}
|
||||
|
||||
if (TREE_CODE (root) == NAMESPACE_DECL)
|
||||
return is_nested_namespace (root, child);
|
||||
if (TREE_CODE (root) != NAMESPACE_DECL)
|
||||
/* Failed to meet the non-namespace we were looking for. */
|
||||
return false;
|
||||
|
||||
return false;
|
||||
if (tree alias = DECL_NAMESPACE_ALIAS (child))
|
||||
child = alias;
|
||||
|
||||
return is_nested_namespace (root, child);
|
||||
}
|
||||
|
||||
/* Enter the class or namespace scope indicated by T suitable for name
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
// PR 91826 bogus error with aliased namespace
|
||||
|
||||
namespace N1 { class C1; }
|
||||
namespace A1 = N1;
|
||||
class A1::C1 {}; //Ok
|
||||
|
||||
namespace N2
|
||||
{
|
||||
namespace N { class C2; }
|
||||
namespace A2 = N;
|
||||
class A2::C2 {}; // { dg_bogus "does not enclose" }
|
||||
}
|
||||
|
||||
namespace N3 { namespace N { class C3; } }
|
||||
namespace A3 = N3::N;
|
||||
class A3::C3 {}; //Ok
|
Loading…
Reference in New Issue