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

--- Comment #5 from Boris Staletic <boris.staletic at protonmail dot com> ---
Previous patch was bad, but this one fixes this bug, pr-123661 and another
similar case.

```
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 1ee8e2fff7..97afc78519 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -21447,8 +21447,28 @@ tsubst_expr (tree t, tree args, tsubst_flags_t
complain, tree in_decl)
        op1 = tsubst_qualified_id (op1, args, complain, in_decl,
                                   /*done=*/true, /*address_p=*/true);
       else
-       op1 = tsubst_non_call_postfix_expression (op1, args, complain,
-                                                 in_decl);
+       {
+         tree old_op1 = op1;
+         op1 = tsubst_non_call_postfix_expression (op1, args, complain,
+                                                   in_decl);
+         if (TREE_CODE (old_op1) == SPLICE_EXPR)
+           {
+             if (TREE_CODE (op1) == BASELINK)
+               {
+                 tree fn = MAYBE_BASELINK_FUNCTIONS (op1);
+                 if (TREE_CODE (fn) == FUNCTION_DECL &&
+                     TREE_CODE (TREE_TYPE (op1) ) == METHOD_TYPE &&
+                     !TREE_STATIC (op1))
+                   op1 = fn;
+               }
+             if (TREE_CODE (op1) == FIELD_DECL ||
+                 (TREE_CODE (op1) == FUNCTION_DECL &&
+                  TREE_CODE (TREE_TYPE (op1)) == METHOD_TYPE &&
+                  !TREE_STATIC (TREE_TYPE (op1))))
+               op1 = build_offset_ref(DECL_CONTEXT(op1), op1, true, complain);
+           }
+
+       }
       RETURN (build_x_unary_op (input_location, ADDR_EXPR, op1,
                                templated_operator_saved_lookups (t),
                                complain|decltype_flag));
```

Honestly, this patch looks ugly and I still don't really understand what
BASELINK is.
Here's a godbolt link to the bigger test case that I was trying to get to work:
https://godbolt.org/z/fo4hbW7rf

Reply via email to