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);
}