Skip to content

Commit

Permalink
PR c++/80891 (#2)
Browse files Browse the repository at this point in the history
	* tree.c (ovl_copy): Adjust assert, copy OVL_LOOKUP.
	(ovl_used): New.
	(lookup_keep): Call it.

	PR c++/80891 (#2)
	* g++.dg/lookup/pr80891-2.C: New.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@248570 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
nathan committed May 29, 2017
1 parent 2377d25 commit 5fde115
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 2 deletions.
5 changes: 5 additions & 0 deletions gcc/cp/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
2017-05-26 Nathan Sidwell <nathan@acm.org>

PR c++/80891 (#2)
* tree.c (ovl_copy): Adjust assert, copy OVL_LOOKUP.
(ovl_used): New.
(lookup_keep): Call it.

Implement DR2061
* name-lookup.c (push_inline_namespaces): New.
(push_namespace): Look inside inline namespaces.
Expand Down
27 changes: 25 additions & 2 deletions gcc/cp/tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -2139,12 +2139,13 @@ ovl_copy (tree ovl)
else
result = make_node (OVERLOAD);

gcc_assert (!OVL_NESTED_P (ovl) && !OVL_LOOKUP_P (ovl));
gcc_checking_assert (!OVL_NESTED_P (ovl) && OVL_USED_P (ovl));
TREE_TYPE (result) = TREE_TYPE (ovl);
OVL_FUNCTION (result) = OVL_FUNCTION (ovl);
OVL_CHAIN (result) = OVL_CHAIN (ovl);
OVL_HIDDEN_P (result) = OVL_HIDDEN_P (ovl);
OVL_USING_P (result) = OVL_USING_P (ovl);
OVL_LOOKUP_P (result) = OVL_LOOKUP_P (ovl);

return result;
}
Expand Down Expand Up @@ -2395,6 +2396,22 @@ lookup_maybe_add (tree fns, tree lookup)
return lookup_add (fns, lookup);
}

/* Regular overload OVL is part of a kept lookup. Mark the nodes on
it as immutable. */

static void
ovl_used (tree ovl)
{
for (;
ovl && TREE_CODE (ovl) == OVERLOAD
&& !OVL_USED_P (ovl);
ovl = OVL_CHAIN (ovl))
{
gcc_checking_assert (!OVL_LOOKUP_P (ovl));
OVL_USED_P (ovl) = true;
}
}

/* If KEEP is true, preserve the contents of a lookup so that it is
available for a later instantiation. Otherwise release the LOOKUP
nodes for reuse. */
Expand All @@ -2407,12 +2424,18 @@ lookup_keep (tree lookup, bool keep)
&& OVL_LOOKUP_P (lookup) && !OVL_USED_P (lookup);
lookup = OVL_CHAIN (lookup))
if (keep)
OVL_USED_P (lookup) = true;
{
OVL_USED_P (lookup) = true;
ovl_used (OVL_FUNCTION (lookup));
}
else
{
OVL_FUNCTION (lookup) = ovl_cache;
ovl_cache = lookup;
}

if (keep)
ovl_used (lookup);
}

/* Returns nonzero if X is an expression for a (possibly overloaded)
Expand Down
5 changes: 5 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2017-05-29 Nathan Sidwell <nathan@acm.org>

PR c++/80891 (#2)
* g++.dg/lookup/pr80891-2.C: New.

2017-05-29 Thomas Koenig <tkoenig@gcc.gnu.org>

PR fortran/37131
Expand Down
29 changes: 29 additions & 0 deletions gcc/testsuite/g++.dg/lookup/pr80891-2.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// PR c++/80891 part 1
// instantiation-time ADL for swap needs to copy a previous lookup
// node, but gets confused.

void swap();

namespace boost {
void swap();
}

using namespace boost;

template <typename T>
void reversible_container_test ()
{
using namespace boost;
T a;
swap (a);
}

namespace boost {
struct A {};
template <typename T> void swap(T);
}

void test_ptr_vector()
{
reversible_container_test<A>;
}

0 comments on commit 5fde115

Please sign in to comment.