Consider the following pr38612.cc file:
--
struct Base {};
struct X; // X derived from Base later but incomplete here
struct Y {}; // Y not derived from Base
int test1(int Base::* p2m, X* object)
{
return object->*p2m; // fails because X is incomplete
}
struct X : Base
{
};
int test2(int Base::* p2m, X* object)
{
return object->*p2m; // OK
}
int test3(int Base::* p2m, Y* object)
{
return object->*p2m; // fails because Y is not derived from Base
}
--
Now for test1 and test3 it produces the following errors:
pr38612.cc: In function 'int test1(int Base::*, X*)':
pr38612.cc:8:21: error: pointer to member type 'int' incompatible \
with incomplete object type 'X'
8 | return object->*p2m; // fails because X is incomplete
| ^~~
pr38612.cc: In function 'int test3(int Base::*, Y*)':
pr38612.cc:22:21: error: pointer to member type 'int' incompatible \
with object type 'Y' because 'Y' is not derived from 'Base'
22 | return object->*p2m; // fails because Y is not derived \
from Base
| ^~~
Signed-off-by: Alex Yesmanchyk <[email protected]>
---
gcc/cp/typeck2.cc | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc
index b090e83c697..0cbc4c89507 100644
--- a/gcc/cp/typeck2.cc
+++ b/gcc/cp/typeck2.cc
@@ -2454,8 +2454,16 @@ build_m_component_ref (tree datum, tree component,
tsubst_flags_t complain)
{
mismatch:
if (complain & tf_error)
- error ("pointer to member type %qT incompatible with object "
- "type %qT", type, objtype);
+ {
+ if (COMPLETE_TYPE_P (objtype))
+ error ("pointer to member type %qT incompatible "
+ "with object type %qT because %qT is not "
+ "derived from %qT", type, objtype,
+ objtype, ctype);
+ else
+ error ("pointer to member type %qT incompatible with "
+ "incomplete object type %qT ", type, objtype);
+ }
return error_mark_node;
}
else if (binfo == error_mark_node)
--
2.50.1 (Apple Git-155)