www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 23308] New: Can't resolve overload of varargs function if one

https://issues.dlang.org/show_bug.cgi?id=23308

          Issue ID: 23308
           Summary: Can't resolve overload of varargs function if one
                    parameter is the result of a ternary expression
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: kytodragon e.mail.de

This code:

```
void foo(string a) {}

void foo(A...)(A a) {}

void bar(bool condition, void* param) {
    float s32;
    foo(condition ? param : &s32);
}
```

results in the following error message:

```
test.d(8): Error: none of the overloads of `foo` are callable using argument
types `(float*)`, candidates are:
test.d(2):        `example.foo(string a)`
test.d(4):        `foo(A...)(A a)`
```

If the condition is removed or if the values inside the ternary expression are
cast to the same type, the error goes away.

```
foo(condition ? param : cast(void*)&s32);
```

The error message also references the wrong type, better seen in this example:

```
void foo(float* a) {}

void bar(bool condition, void* param) {
    float s32;
    foo(condition ? param : &s32);
}
```

```
test.d(5): Error: function `example.foo(float* a)` is not callable using
argument types `(float*)`
test.d(5):        cannot pass argument `condition ? param : & s32` of type
`float*` to parameter `float* a`

```

Reproducible with all versions of DMD and LDC.

--
Aug 28 2022