public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/24847] New: Instantiates un-called copy constructor
@ 2005-11-14 14:06 igodard at pacbell dot net
2005-11-14 19:32 ` [Bug c++/24847] " pinskia at gcc dot gnu dot org
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: igodard at pacbell dot net @ 2005-11-14 14:06 UTC (permalink / raw)
To: gcc-bugs
enum A{b,c};
template<typename T, int i, A x>
struct foo {
explicit foo(T& t);
explicit foo(foo<T, 0, x>);
};
int main() {
int i;
foo<int, 5, b> v(i);
}
gets you:
~/ootbc/members/src$ g++ foo.cc
foo.cc: In instantiation of `foo<int, 0, b>':
foo.cc:10: instantiated from here
foo.cc:5: error: invalid constructor; you probably meant `foo<int, 0, b>
(const foo<int, 0, b>&)'
The error arises because it thinks I am instantiating "foo<T, 0,A>(foo<T, 0,
A>)", i.e. a copy constructor that is not taking a const reference argument.
But I'm not; I'm instantiating the plain constructor "foo<T, int, A>(int&)".
The second constructor is intended to catch the case: "foo<T, 5, A>(foo<T, 0,
A>", i.e. to convert an instance of foo with second argument zero to a foo with
any other second argument. It looks like when it is expanding the argument type
of the second constructor (i.e. "foo<T, 0, A>") that it is not just parsing the
resulting template but also applying the "valid copy constructor?" check for
that type. But as that second constructor is never called by anyone it the
compiler should just syntax check it (valid) and not semantic check it (invalid
for "foo(T, 0, A)" but valid for everything else).
Ivan
--
Summary: Instantiates un-called copy constructor
Product: gcc
Version: 3.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: igodard at pacbell dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24847
^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <bug-24847-4@http.gcc.gnu.org/bugzilla/>]
* [Bug c++/24847] Instantiates un-called copy constructor
[not found] <bug-24847-4@http.gcc.gnu.org/bugzilla/>
@ 2021-08-01 23:30 ` pinskia at gcc dot gnu.org
2021-08-02 9:11 ` redi at gcc dot gnu.org
2021-08-02 9:14 ` redi at gcc dot gnu.org
2 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-08-01 23:30 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=24847
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
these compiler reject this code:
GCC
MSVC
ICC
Only clang accepts the code.
All of the ones which reject it, all say the constructor is a copy constructor.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/24847] Instantiates un-called copy constructor
[not found] <bug-24847-4@http.gcc.gnu.org/bugzilla/>
2021-08-01 23:30 ` pinskia at gcc dot gnu.org
@ 2021-08-02 9:11 ` redi at gcc dot gnu.org
2021-08-02 9:14 ` redi at gcc dot gnu.org
2 siblings, 0 replies; 7+ messages in thread
From: redi at gcc dot gnu.org @ 2021-08-02 9:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=24847
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Overload resolution considers both constructors, to decide which one v(i)
should use. Performing overload resolution on foo<int, 5, b>::foo(foo<int, 0,
b>) will cause the instantiation of struct foo<int, 0, b> to see if there is a
valid conversion sequence from int to foo<int, 0, b>. Instantiating that type
causes the instantiation of foo<int, 0, b>::foo(foo<int, 0, b>) which is indeed
an invalid copy constructor.
So the problem is not that it thinks the second constructor is a copy
constructor of foo<int, 5, b>, obviously it's not. But it is an invalid copy
constructor for foo<int, 0, b> which gets implicitly instantiated.
I don't know how Clang accepts this.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/24847] Instantiates un-called copy constructor
[not found] <bug-24847-4@http.gcc.gnu.org/bugzilla/>
2021-08-01 23:30 ` pinskia at gcc dot gnu.org
2021-08-02 9:11 ` redi at gcc dot gnu.org
@ 2021-08-02 9:14 ` redi at gcc dot gnu.org
2 siblings, 0 replies; 7+ messages in thread
From: redi at gcc dot gnu.org @ 2021-08-02 9:14 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=24847
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Ivan Godard from comment #0)
> The second constructor is intended to catch the case: "foo<T, 5, A>(foo<T,
> 0, A>", i.e. to convert an instance of foo with second argument zero to a
> foo with any other second argument.
You can define that as:
explicit foo(const foo<T, 0, x>&);
Or:
template<int N, typename = std::enable_if_t<N == 0 && i != 0>
explicit foo(foo<T, N, x>);
Or in C++20:
explicit foo(foo<T, 0, x>) requires (i != 0);
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-08-02 9:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-14 14:06 [Bug c++/24847] New: Instantiates un-called copy constructor igodard at pacbell dot net
2005-11-14 19:32 ` [Bug c++/24847] " pinskia at gcc dot gnu dot org
2005-11-15 0:30 ` igodard at pacbell dot net
2005-11-23 5:21 ` bangerth at dealii dot org
[not found] <bug-24847-4@http.gcc.gnu.org/bugzilla/>
2021-08-01 23:30 ` pinskia at gcc dot gnu.org
2021-08-02 9:11 ` redi at gcc dot gnu.org
2021-08-02 9:14 ` redi at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).