aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-08-29 13:27:13 -0400
committerJason Merrill <jason@redhat.com>2024-08-30 15:19:50 -0400
commitf93a38f3fc8b20942896d037f3833d6b383dd3d8 (patch)
tree46e4d048d052db9f9859cdc918577df60b7aa620
parentb222122d4e93de2238041a01b1886c7dfd9944da (diff)
downloadgcc-f93a38f3fc8b20942896d037f3833d6b383dd3d8.zip
gcc-f93a38f3fc8b20942896d037f3833d6b383dd3d8.tar.gz
gcc-f93a38f3fc8b20942896d037f3833d6b383dd3d8.tar.bz2
c++: fix used but not defined warning for friend
Here limit_bad_template_recursion avoids instantiating foo, and then we wrongly warn that it isn't defined, because as a non-template (but templated) friend DECL_TEMPLATE_INSTANTIATION is false. gcc/cp/ChangeLog: * decl2.cc (c_parse_final_cleanups): Also check DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/used-inline1.C: New test.
-rw-r--r--gcc/cp/decl2.cc3
-rw-r--r--gcc/testsuite/g++.dg/diagnostic/used-inline1.C12
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index e9ae979..c67e3e0 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -5559,7 +5559,8 @@ c_parse_final_cleanups (void)
&& !(header_module_p ()
&& (DECL_DEFAULTED_FN (decl) || decl_tls_wrapper_p (decl)))
/* Don't complain if the template was defined. */
- && !(DECL_TEMPLATE_INSTANTIATION (decl)
+ && !((DECL_TEMPLATE_INSTANTIATION (decl)
+ || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
&& DECL_INITIAL (DECL_TEMPLATE_RESULT
(template_for_substitution (decl))))
&& warning_at (DECL_SOURCE_LOCATION (decl), 0,
diff --git a/gcc/testsuite/g++.dg/diagnostic/used-inline1.C b/gcc/testsuite/g++.dg/diagnostic/used-inline1.C
new file mode 100644
index 0000000..ce4882e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/diagnostic/used-inline1.C
@@ -0,0 +1,12 @@
+template <class T> struct A {
+ friend void foo(A*) { } // { dg-bogus "never defined" }
+ void bar() {
+ baz(this); // { dg-error "baz" }
+ foo(this);
+ }
+};
+
+int main()
+{
+ A<int>().bar();
+}