https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115163
Bug ID: 115163
Summary: Requesting better diagnostic for explicit constructor
failure
Product: gcc
Version: 14.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: barry.revzin at gmail dot com
Target Milestone: ---
Here's a simple program:
struct C {
explicit C(int);
};
int main() {
C c = 42;
}
gcc's error for this right now is:
<source>:6:11: error: conversion from 'int' to non-scalar type 'C' requested
6 | C c = 42;
| ^~
clang's error, on the other hand, is much more informative:
<source>:6:7: error: no viable conversion from 'int' to 'C'
6 | C c = 42;
| ^ ~~
<source>:1:8: note: candidate constructor (the implicit copy constructor) not
viable: no known conversion from 'int' to 'const C &' for 1st argument
1 | struct C {
| ^
<source>:1:8: note: candidate constructor (the implicit move constructor) not
viable: no known conversion from 'int' to 'C &&' for 1st argument
1 | struct C {
| ^
<source>:2:14: note: explicit constructor is not a candidate
2 | explicit C(int);
| ^
Ideally we could get something that was closer to this (i.e. given that
overload resolution succeeds and picks the explicit constructor if it were a
candidate, that's probably the right thing to tell the user):
<source>:6:7: error: no viable conversion from 'int' to 'C'
6 | C c = 42;
| ^ ~~
<source>:2:14: note: explicit constructor is not a candidate
2 | explicit C(int);
| ^