https://gcc.gnu.org/g:2ee70c9f83a1033f2897a35bff9e9ffdd03cc651

commit r15-2159-g2ee70c9f83a1033f2897a35bff9e9ffdd03cc651
Author: Patrick Palka <ppa...@redhat.com>
Date:   Fri Jul 19 13:48:12 2024 -0400

    c++: xobj fn call without obj [PR115783]
    
    The code path for rejecting an object-less call to a non-static member
    function should also consider xobj member functions (so that we correctly
    reject the below calls with a "cannot call member function without object"
    diagnostic).
    
            PR c++/115783
    
    gcc/cp/ChangeLog:
    
            * call.cc (build_new_method_call): Generalize METHOD_TYPE
            check to DECL_OBJECT_MEMBER_FUNCTION_P.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp23/explicit-obj-diagnostics11.C: New test.
    
    Reviewed-by: Jason Merrill <ja...@redhat.com>

Diff:
---
 gcc/cp/call.cc                                     |  2 +-
 .../g++.dg/cpp23/explicit-obj-diagnostics11.C      | 48 ++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index a5d3426b70c4..40cb582acc70 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -11855,7 +11855,7 @@ build_new_method_call (tree instance, tree fns, 
vec<tree, va_gc> **args,
                         fn);
            }
 
-         if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE
+         if (DECL_OBJECT_MEMBER_FUNCTION_P (fn)
              && !DECL_CONSTRUCTOR_P (fn)
              && is_dummy_object (instance))
            {
diff --git a/gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics11.C 
b/gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics11.C
new file mode 100644
index 000000000000..cc2571f62a2d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics11.C
@@ -0,0 +1,48 @@
+// PR c++/115783
+// { dg-do compile { target c++23 } }
+
+struct A {
+  int f(this auto);
+
+  static void s() {
+    f(); // { dg-error "without object" }
+  }
+};
+
+int n = A::f(); // { dg-error "without object" }
+
+struct B {
+  void ns() {
+    A::f(); // { dg-error "without object" }
+  }
+
+  static void s() {
+    A::f(); // { dg-error "without object" }
+  }
+};
+
+template<class T>
+struct C {
+  void ns() {
+    A::f(); // { dg-error "without object" }
+    T::f(); // { dg-error "without object" }
+  }
+
+  static void s() {
+    A::f(); // { dg-error "without object" }
+    T::f(); // { dg-error "without object" }
+  };
+};
+
+template struct C<A>;
+
+template<class T>
+struct D : T {
+  void ns() {
+    A::f(); // { dg-error "without object" }
+    T::f(); // { dg-error "not a member of 'B'" }
+  }
+};
+
+template struct D<B>; // { dg-message "required from here" }
+template struct D<A>; // { dg-bogus "required from here" }

Reply via email to