This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/56953] New: [4.9]Inheriting constructors triggers instantiation of parameters at point of declaration
- From: "lucdanton at free dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 14 Apr 2013 12:40:19 +0000
- Subject: [Bug c++/56953] New: [4.9]Inheriting constructors triggers instantiation of parameters at point of declaration
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56953
Bug #: 56953
Summary: [4.9]Inheriting constructors triggers instantiation of
parameters at point of declaration
Classification: Unclassified
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: lucdanton@free.fr
Created attachment 29871
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29871
Testcase
I am using:
g++-snapshot (Debian 20130330-1) 4.9.0 20130330 (experimental) [trunk revision
197260]
According to the diagnostic GCC gives, in some cases a using declaration that
bring constructors into scope also triggers the instantiation of their
parameters.
The attachment is an example where a parameter takes the form
`requires_complete<completed_later>`, where specializations of
`requires_complete` are only valid when the template argument is complete. When
inheriting a constructor taking such a parameter, GCC complains about an
ill-formed specialization and points to the using declaration as having
triggered the instantiation. This is regardless of the program using that
constructor or not.
I believe the equivalent program which doesn't use inheriting constructors is
correct, as the instantiation takes place at the point of use and not the point
of declaration, where the argument `completed_later` is completed. At the very
least it is accepted by GCC (changing the define at the top of the file
controls that).
Do note that if `requires_complete` is itself left incomplete and not defined
until later in the program, then GCC accepts the program. Presumably those
parameters that are not themselves complete are not instantiated.
The same happens using a snapshot of pre-release 4.8.