public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts  Денис Шкиря <denis.shkirja@gmail.com>
@ 2022-02-22  9:47 denis.shkirja at gmail dot com
  2022-02-22  9:58 ` [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts pinskia at gcc dot gnu.org
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: denis.shkirja at gmail dot com @ 2022-02-22  9:47 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 104634
           Summary: Explicit template instantiation does not work when
                    there are multiple partial template specialization
                    using concepts  Денис Шкиря <denis.shkirja at gmail dot com>
           Product: gcc
           Version: 10.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: denis.shkirja at gmail dot com
  Target Milestone: ---

In the code below I am trying to explicitly instantiate two different
partial specializations of a template struct with static function and
I expect to see two global weak symbols (W) that correspond to
different instantiations of that function in the object file. But for
some reason I see only one symbol that corresponds to the first
specialization. I observe this behavior on all gcc versions from 10.01 to 12 (I
checked it using godbolt - https://godbolt.org/z/4ev4ePPYe).
Also, it looks like Clang and MSVC produce both symbols.

The reproducer:
```
$ cat main.cpp
#include <concepts>

template<typename T>
struct Struct {
static void func();
};

template<std::same_as<int> T>
struct Struct<T> {
static void func() {}
};

template<std::same_as<double> T>
struct Struct<T> {
static void func() {}
};

template struct Struct<double>;
template struct Struct<int>;


$ g++ -c ./main.cpp -std=gnu++20 -o main.o
$ nm -C main.o
0000000000000000 W Struct<int>::func()
```
GCC version that I used to reproduce the problem locally:
```
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
11.1.0-1ubuntu1~18.04.1'
--with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2
--prefix=/usr --with-gcc-major-version-only --program-suffix=-11
--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 --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin
--enable-default-pie --with-system-zlib
--enable-libphobos-checking=release --with-target-system-zlib=auto
--enable-objc-gc=auto --enable-multiarch --disable-werror
--disable-cet --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib
--with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-11-YRKbe7/gcc-11-11.1.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-YRKbe7/gcc-11-11.1.0/debian/tmp-gcn/usr
--without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.1.0 (Ubuntu 11.1.0-1ubuntu1~18.04.1)
```

I am not sure if this will be useful, but here is what the symbols
look like when compiled with clang:
```
$ /usr/lib/llvm-13/bin/clang -c ./main.cpp -std=c++20 -o main_clang.o
$ nm -C main_clang.o
0000000000000000 W Struct<double>::func()
0000000000000000 W Struct<int>::func()
```

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts
  2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
@ 2022-02-22  9:58 ` pinskia at gcc dot gnu.org
  2023-12-15  5:47 ` pinskia at gcc dot gnu.org
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-02-22  9:58 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
           Keywords|                            |link-failure
   Last reconfirmed|                            |2022-02-22
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Confirmed,
template <class T1, class T2>
constexpr bool type_same = false;

template<class T1>
constexpr bool type_same<T1, T1> = true;

template <typename T1, typename T2>
concept same_as = type_same<T1, T2>;

template<typename T>
struct Struct {
static void func1(){}
};

template<same_as<int> T>
struct Struct<T> {
static void func3() {}
};

template<same_as<double> T>
struct Struct<T> {
static void func2() {}
};

template struct Struct<int>;
template struct Struct<double>;

----- CUT ----
The function is in .original so maybe it is not being marked as used ....

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts
  2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
  2022-02-22  9:58 ` [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts pinskia at gcc dot gnu.org
@ 2023-12-15  5:47 ` pinskia at gcc dot gnu.org
  2024-01-15 21:54 ` cvs-commit at gcc dot gnu.org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-12-15  5:47 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |adrian at woeltche dot de

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
*** Bug 113020 has been marked as a duplicate of this bug. ***

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts
  2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
  2022-02-22  9:58 ` [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts pinskia at gcc dot gnu.org
  2023-12-15  5:47 ` pinskia at gcc dot gnu.org
@ 2024-01-15 21:54 ` cvs-commit at gcc dot gnu.org
  2024-01-15 21:54 ` ppalka at gcc dot gnu.org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-01-15 21:54 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:47673571b28278d857371167f4b67a04a1b87b59

commit r14-7261-g47673571b28278d857371167f4b67a04a1b87b59
Author: Patrick Palka <ppalka@redhat.com>
Date:   Mon Jan 15 16:53:28 2024 -0500

    c++: explicit inst w/ similar constrained partial specs [PR104634]

    Here we neglect to emit the definitions of A<double>::f2 and A<double*>::f4
    despite the explicit instantiations ultimately because TREE_PUBLIC isn't
    set on the corresponding partial specializations, whose declarations are
    created from maybe_new_partial_specialization which is responsible for
    disambiguating them from the first and third partial specializations (which
    have the same class-head but different constraints).  This makes grokfndecl
    in turn clear TREE_PUBLIC for f2 and f4 as if they have internal linkage.

    This patch fixes this by setting TREE_PUBLIC appropriately for such partial
    specializations.

            PR c++/104634

    gcc/cp/ChangeLog:

            * pt.cc (maybe_new_partial_specialization): Propagate TREE_PUBLIC
            to the newly created partial specialization.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp2a/concepts-explicit-inst6.C: New test.

    Reviewed-by: Jason Merrill <jason@redhat.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts
  2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
                   ` (2 preceding siblings ...)
  2024-01-15 21:54 ` cvs-commit at gcc dot gnu.org
@ 2024-01-15 21:54 ` ppalka at gcc dot gnu.org
  2024-01-15 22:34 ` cvs-commit at gcc dot gnu.org
  2024-01-15 22:35 ` ppalka at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: ppalka at gcc dot gnu.org @ 2024-01-15 21:54 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |ppalka at gcc dot gnu.org
             Status|NEW                         |ASSIGNED
   Target Milestone|---                         |13.3

--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Fixed on trunk so far.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts
  2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
                   ` (3 preceding siblings ...)
  2024-01-15 21:54 ` ppalka at gcc dot gnu.org
@ 2024-01-15 22:34 ` cvs-commit at gcc dot gnu.org
  2024-01-15 22:35 ` ppalka at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-01-15 22:34 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Patrick Palka
<ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:854c9b682562b103f60e5f0a823f31df17a97568

commit r13-8225-g854c9b682562b103f60e5f0a823f31df17a97568
Author: Patrick Palka <ppalka@redhat.com>
Date:   Mon Jan 15 16:53:28 2024 -0500

    c++: explicit inst w/ similar constrained partial specs [PR104634]

    Here we neglect to emit the definitions of A<double>::f2 and A<double*>::f4
    despite the explicit instantiations ultimately because TREE_PUBLIC isn't
    set on the corresponding partial specializations, whose declarations are
    created from maybe_new_partial_specialization which is responsible for
    disambiguating them from the first and third partial specializations (which
    have the same class-head but different constraints).  This makes grokfndecl
    in turn clear TREE_PUBLIC for f2 and f4 as if they have internal linkage.

    This patch fixes this by setting TREE_PUBLIC appropriately for such partial
    specializations.

            PR c++/104634

    gcc/cp/ChangeLog:

            * pt.cc (maybe_new_partial_specialization): Propagate TREE_PUBLIC
            to the newly created partial specialization.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp2a/concepts-explicit-inst6.C: New test.

    Reviewed-by: Jason Merrill <jason@redhat.com>
    (cherry picked from commit 47673571b28278d857371167f4b67a04a1b87b59)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts
  2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
                   ` (4 preceding siblings ...)
  2024-01-15 22:34 ` cvs-commit at gcc dot gnu.org
@ 2024-01-15 22:35 ` ppalka at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: ppalka at gcc dot gnu.org @ 2024-01-15 22:35 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
             Status|ASSIGNED                    |RESOLVED

--- Comment #6 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Fixed for GCC 13.3 and 14, thanks for the bug report.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-01-15 22:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-22  9:47 [Bug c++/104634] New: Explicit template instantiation does not work when there are multiple partial template specialization using concepts Денис Шкиря <denis.shkirja@gmail.com> denis.shkirja at gmail dot com
2022-02-22  9:58 ` [Bug c++/104634] Explicit template instantiation does not work when there are multiple partial template specialization using concepts pinskia at gcc dot gnu.org
2023-12-15  5:47 ` pinskia at gcc dot gnu.org
2024-01-15 21:54 ` cvs-commit at gcc dot gnu.org
2024-01-15 21:54 ` ppalka at gcc dot gnu.org
2024-01-15 22:34 ` cvs-commit at gcc dot gnu.org
2024-01-15 22:35 ` ppalka 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).