https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124440

--- Comment #1 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Patch:

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 53fbb75b15a..faaad1e2cc2 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -9733,14 +9733,18 @@ cp_parser_postfix_dot_deref_expression (cp_parser
*parser,
              parser->object_scope = NULL_TREE;
            }
          if ((parser->scope || splice_p) && name && BASELINK_P (name))
-           adjust_result_of_qualified_name_lookup
-             (name,
-              /* For obj->[:^^R:] we won't have parser->scope, but we still
-                 have to perform this adjustment.  */
-              (splice_p
-               ? BINFO_TYPE (BASELINK_ACCESS_BINFO (name))
-               : parser->scope),
-              scope);
+           {
+             adjust_result_of_qualified_name_lookup
+               (name,
+                /* For obj->[:^^R:] we won't have parser->scope, but we still
+                   have to perform this adjustment.  */
+                (splice_p
+                 ? BINFO_TYPE (BASELINK_ACCESS_BINFO (name))
+                 : parser->scope),
+                scope);
+             if (splice_p)
+               BASELINK_QUALIFIED_P (name) = false;
+           }
          postfix_expression
            = finish_class_member_access_expr (postfix_expression, name,
                                               template_p,
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 7a6476caf89..c2a3e85bff4 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -22433,6 +22433,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t
complain, tree in_decl)
        object_type = TREE_TYPE (object);

        member = TREE_OPERAND (t, 1);
+       const bool splice_p = dependent_splice_p (member);
        if (BASELINK_P (member))
          member = tsubst_baselink (member,
                                    non_reference (TREE_TYPE (object)),
@@ -22528,6 +22529,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t
complain, tree in_decl)
              }
            RETURN (error_mark_node);
          }
+       else if (splice_p && BASELINK_P (member))
+         {
+           member = (adjust_result_of_qualified_name_lookup
+                     (member, BINFO_TYPE (BASELINK_BINFO (member)),
+                      object_type));
+           BASELINK_QUALIFIED_P (member) = false;
+         }

        r = finish_class_member_access_expr (object, member,
                                             /*template_p=*/false,
diff --git a/gcc/testsuite/g++.dg/reflect/member21.C
b/gcc/testsuite/g++.dg/reflect/member21.C
index 48ce3f1631d..fd69621dac2 100644
--- a/gcc/testsuite/g++.dg/reflect/member21.C
+++ b/gcc/testsuite/g++.dg/reflect/member21.C
@@ -16,11 +16,10 @@ f ()
   static_assert(d.U::fn() == 2);
   static_assert(d.D::fn() == 2);
   static_assert(d.fn() == 2);
-  // FIXME PR124440
-  //static_assert(d.[:^^T::fn:]() == 2);
+  static_assert(d.[:^^T::fn:]() == 2);
   static_assert(d.[:^^T:]::fn() == 1);
   static_assert(d.T::fn() == 1);
-  //static_assert(d.[:^^B::fn:]() == 2);
+  static_assert(d.[:^^B::fn:]() == 2);
   static_assert(d.[:^^B:]::fn() == 1);
   static_assert(d.B::fn() == 1);
 }

Reply via email to