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

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
To be precise, I meant something like:
--- gcc/cp/constexpr.c.jj       2019-11-27 10:03:37.916867165 +0100
+++ gcc/cp/constexpr.c  2019-11-27 16:55:17.475150697 +0100
@@ -1441,6 +1441,22 @@ cxx_bind_parameters_in_call (const const
            arg = adjust_temp_type (type, arg);
          if (!TREE_CONSTANT (arg))
            *non_constant_args = true;
+         if (i == 0
+             && DECL_VIRTUAL_P (fun))
+           {
+             tree addr = arg;
+             STRIP_NOPS (addr);
+             if (TREE_CODE (addr) == ADDR_EXPR)
+               {
+                 tree obj = TREE_OPERAND (addr, 0);
+                 while (TREE_CODE (obj) == COMPONENT_REF
+                        && DECL_FIELD_IS_BASE (TREE_OPERAND (obj, 1)))
+                   obj = TREE_OPERAND (obj, 0);
+                 if (obj != TREE_OPERAND (addr, 0))
+                   arg = build_fold_addr_expr_with_type (obj,
+                                                         TREE_TYPE (arg));
+               }
+           }
          TREE_VEC_ELT (binds, i) = arg;
        }
       parms = TREE_CHAIN (parms);

This fixes the testcase.  Note, there is still a weird warning:
pr92695.C:3:25: warning: inline function ‘virtual constexpr int A::set(A*)’
used but never defined
    3 |   constexpr virtual int set (A *o) = 0;
      |                         ^~~

Reply via email to