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: unassig...@gcc.gnu.org

        ReportedBy: lucdan...@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.

Reply via email to