aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-09-22 09:00:20 -0700
committerNathan Sidwell <nathan@acm.org>2020-09-22 09:05:20 -0700
commit7dfffe32419a963660f5c04b40b8f0becd509b69 (patch)
treee5233181fc5ad8f5213a171fda2bae5be6dd459e
parent160061ac10f9143d9698daac5f7e46b5a615825c (diff)
downloadgcc-7dfffe32419a963660f5c04b40b8f0becd509b69.zip
gcc-7dfffe32419a963660f5c04b40b8f0becd509b69.tar.gz
gcc-7dfffe32419a963660f5c04b40b8f0becd509b69.tar.bz2
c++: fix injected friend of template class
In working on fixing hiddenness, I discovered some suspicious code in template instantiation. I suspect it dates from when we didn't do the hidden friend injection thing at all. The xreftag finds the same class, but makes it visible to name lookup. Which is wrong. hurrah, fixing a bug by deleting code! gcc/cp/ * pt.c (instantiate_class_template_1): Do not repush and unhide injected friend. gcc/testsuite/ * g++.old-deja/g++.pt/friend34.C: Check injected friend is still invisible.
-rw-r--r--gcc/cp/pt.c19
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/friend34.C5
2 files changed, 4 insertions, 20 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 97d0c24..44ca14a 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12030,25 +12030,6 @@ instantiate_class_template_1 (tree type)
adjust_processing_template_decl = true;
--processing_template_decl;
}
- else if (TREE_CODE (friend_type) != BOUND_TEMPLATE_TEMPLATE_PARM
- && !CLASSTYPE_USE_TEMPLATE (friend_type)
- && TYPE_HIDDEN_P (friend_type))
- {
- /* friend class C;
-
- where C hasn't been declared yet. Let's lookup name
- from namespace scope directly, bypassing any name that
- come from dependent base class. */
- tree ns = decl_namespace_context (TYPE_MAIN_DECL (friend_type));
-
- /* The call to xref_tag_from_type does injection for friend
- classes. */
- push_nested_namespace (ns);
- friend_type =
- xref_tag_from_type (friend_type, NULL_TREE,
- /*tag_scope=*/ts_current);
- pop_nested_namespace (ns);
- }
else if (uses_template_parms (friend_type))
/* friend class C<T>; */
friend_type = tsubst (friend_type, args,
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/friend34.C b/gcc/testsuite/g++.old-deja/g++.pt/friend34.C
index 5e80ab9..dcd6df0 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/friend34.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/friend34.C
@@ -6,9 +6,12 @@
template <typename T = void>
class bar {
public:
- friend class foo; // this is not bar::foo, it forward-declares ::foo
+ friend class foo; // this is not bar::foo, it injects hidden ::foo
class foo {};
bar() { foo(); } // but this should refer to bar::foo
};
bar<> baz;
+
+// We still have not made foo visible.
+foo *b; // { dg-error "does not name a type" }