[Bug c++/88634] New: [c++17] Error message when deducing templated types for a constructor with more than one argument when using `new`

jacksonmcneillnospam at gmail dot com gcc-bugzilla@gcc.gnu.org
Sat Dec 29 21:57:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88634

            Bug ID: 88634
           Summary: [c++17] Error message when deducing templated types
                    for a constructor with more than one argument when
                    using `new`
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jacksonmcneillnospam at gmail dot com
  Target Milestone: ---

Created attachment 45307
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45307&action=edit
the preprocessed source given by gcc

g++ -v output:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8.2.0-7ubuntu1'
--with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr
--with-gcc-major-version-only --program-suffix=-8
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
--with-system-zlib --with-target-system-zlib --enable-objc-gc=auto
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 8.2.0 (Ubuntu 8.2.0-7ubuntu1) 

----- 
C++ version: c++17

gcc is unable to deduce class template parameters from class constructor
arguments if there are more than one class constructor arguments. The error
message gcc gives is also rather confusing, saying that no arguments where
specified to the constructor. This only happens when creating the class with
`new`. 


/*!
 * Compile with: g++ -std=c++17 bug_code.cpp
 */



template<typename T>
class bug_class  
{
        public:
                bug_class(int, T )
                {
                }
};

template<typename T>
class no_bug_class
{
        public:
                no_bug_class(T )
                {
                }
};

template<typename T>
class bug_class_swapped
{
        public:
                bug_class_swapped(T, int)
                {
                }
};
template<typename T, typename Y>
class bug_class_double_template
{
        public:
                bug_class_double_template(T, Y)
                {
                }
};

int main()
{
        bug_class(0,2); 
        new bug_class(0,2);  //This errors.


        no_bug_class(0);
        new no_bug_class(0);

        bug_class_swapped(0,1);
        new bug_class_swapped(0,1); //This errors.


        bug_class_double_template(1,2);
        new bug_class_double_template(1,2); //This errors.

        return 0;
}



-------

This doesn't happen if you remove `new` and allocate bug_class on the stack.
This is demonstrated in the code provided.

It seems like gcc is unable to automatically deduce class template arguments
from the constructor arguments when a non-templated argument exists within the
constructor.

In clang++-7, this code compiles just fine.

-----

bug_code.cpp: In function ‘int main()’:                                         
bug_code.cpp:45:19: error: class template argument deduction failed:            
  new bug_class(0,2);  //This errors.                                           
                   ^                                                     
bug_code.cpp:45:19: error: no matching function for call to ‘bug_class()’       
bug_code.cpp:11:3: note: candidate: ‘template<class T> bug_class(int, T)->
bug_class<T>’
   bug_class(int, T )                                                
   ^~~~~~~~~                                                               
bug_code.cpp:11:3: note:   template argument deduction/substitution failed:
bug_code.cpp:45:19: note:   candidate expects 2 arguments, 0 provided
  new bug_class(0,2);  //This errors.                        
                   ^                                                            
bug_code.cpp:52:27: error: class template argument deduction failed:            
  new bug_class_swapped(0,1); //This errors.                                    
                           ^                                                    
bug_code.cpp:52:27: error: no matching function for call to
‘bug_class_swapped()’                       
bug_code.cpp:29:3: note: candidate: ‘template<class T> bug_class_swapped(T,
int)-> bug_class_swapped<T>’
   bug_class_swapped(T, int)                                         
   ^~~~~~~~~~~~~~~~~                                                       
bug_code.cpp:29:3: note:   template argument deduction/substitution failed: 
bug_code.cpp:52:27: note:   candidate expects 2 arguments, 0 provided       
  new bug_class_swapped(0,1); //This errors.                        
                           ^                                        
bug_code.cpp:56:35: error: class template argument deduction failed:
  new bug_class_double_template(1,2); //This errors.                            
                                   ^                                            
bug_code.cpp:56:35: error: no matching function for call to
‘bug_class_double_template()’                                         
bug_code.cpp:37:3: note: candidate: ‘template<class T, class Y>
bug_class_double_template(T, Y)-> bug_class_double_template<T, Y>’
   bug_class_double_template(T, Y)                                         
   ^~~~~~~~~~~~~~~~~~~~~~~~~                                               
bug_code.cpp:37:3: note:   template argument deduction/substitution failed:
bug_code.cpp:56:35: note:   candidate expects 2 arguments, 0 provided
  new bug_class_double_template(1,2); //This errors.          


-----


More information about the Gcc-bugs mailing list