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)

Reply via email to