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

            Bug ID: 105757
           Summary: default argument of incomplete type with C++20
           Product: gcc
           Version: 12.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fsb4000 at yandex dot ru
  Target Milestone: ---

Hi!

One user reported that some code doesn't work with current MSVC but worked
before and works with gcc.

Reduced code:

template <class T>
struct A {
    constexpr A() {}
    constexpr ~A() { T t; }
};

struct B;
void f(const A<B>& = {});

$ g++ -std=c++20 -c main.cpp

https://gcc.godbolt.org/z/jWdd3Gc5h

MSVC devs think that the code is not valid and I decided to inform you:

Cameron DaCamara: "I'm pretty convinced this is a source bug and that GCC
hasn't quite implemented
P0859R0(https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0859r0.html)
fully yet. The reason this is now observable with newer MSVC versions is
because the compiler is required to instantiate special member functions if
they could be potentially used for constant evaluation. Since the default
argument here is going to end up being assigned to a variable the ctor and dtor
are actually odr-used in the default argument."


Also if we reformat the code slightly(A<B>{} instead of {}) then it is rejected
by gcc:

template <class T>
struct A {
    constexpr A() {}
    constexpr ~A() { T t; }
};

struct B;
void f(const A<B>& = A<B>{});

$ g++ -std=c++20 -c main.cpp
main.cpp: In instantiation of 'constexpr A<T>::~A() [with T = B]':
main.cpp:9:27:   required from here
main.cpp:5:24: error: 'B t' has incomplete type
    5 |     constexpr ~A() { T t; }
      |


My GCC version:

$ g++ -v
Using built-in specs.
COLLECT_GCC=C:\tools\msys64\mingw64\bin\g++.exe
COLLECT_LTO_WRAPPER=C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-12.1.0/configure --prefix=/mingw64
--with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32
--host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32
--with-native-system-header-dir=/mingw64/include --libexecdir=/mingw64/lib
--enable-bootstrap --enable-checking=release --with-arch=x86-64
--with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit
--enable-shared --enable-static --enable-libatomic --enable-threads=posix
--enable-graphite --enable-fully-dynamic-string
--enable-libstdcxx-filesystem-ts --enable-libstdcxx-time
--disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-multilib
--disable-rpath --disable-win32-registry --disable-nls --disable-werror
--disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64
--with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64
--with-pkgversion='Rev2, Built by MSYS2 project'
--with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as
--with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++
--with-stage1-ldflags=-static-libstdc++
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.1.0 (Rev2, Built by MSYS2 project)

Reply via email to