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 <jason@redhat.com> (cherry picked from commit 2ee70c9f83a1033f2897a35bff9e9ffdd03cc651)
This commit is contained in:
parent
dfae324da5
commit
50ff112d17
2 changed files with 49 additions and 1 deletions
|
@ -11820,7 +11820,7 @@ build_new_method_call (tree instance, tree fns, vec<tree, va_gc> **args,
|
||||||
fn);
|
fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE
|
if (DECL_OBJECT_MEMBER_FUNCTION_P (fn)
|
||||||
&& !DECL_CONSTRUCTOR_P (fn)
|
&& !DECL_CONSTRUCTOR_P (fn)
|
||||||
&& is_dummy_object (instance))
|
&& is_dummy_object (instance))
|
||||||
{
|
{
|
||||||
|
|
48
gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics11.C
Normal file
48
gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics11.C
Normal file
|
@ -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" }
|
Loading…
Add table
Reference in a new issue