public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/109942] New: Function template declared extern is implicitly instantiated on -O optimization level when return type is auto
@ 2023-05-23 12:39 simon-pfahler at gmx dot de
  2023-05-23 13:30 ` [Bug c++/109942] " redi at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: simon-pfahler at gmx dot de @ 2023-05-23 12:39 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 109942
           Summary: Function template declared extern is implicitly
                    instantiated on -O optimization level when return type
                    is auto
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: simon-pfahler at gmx dot de
  Target Milestone: ---

Created attachment 55143
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55143&action=edit
preprocessed *.ii file

Declaring a template function as extern, but not providing a definition should
lead to a linker error. This does not work on higher optimization levels, if
the template function's return type is `auto`.

The code is:

```
template<class T>
auto foo() { return; }

extern template auto foo<int>();

int main() { foo<int>(); }
```

This fails to link when the command line is `g++ test.cpp`, as it should. But
for `g++ -O test.cpp`, the compilation and linkage works. Explicitly stating
the return type (replacing `auto` by `void`) leads to correct behavior (linker
failure on any optimization level).

Similar examples can be constructed where compilation with optimizatio <=-O1
leads to expected failure, while compilation is successfull for optimization
>=-O2.

This is problematic when return types can not easily be determined and
explicitly stated.
The bug leads to unwanted instantiation of the template, which means longer
compile time if a definition would be provided in a different compilation unit.

Additional info:
gcc -v:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/12/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='Debian 12.2.0-14'
--with-bugurl=file:///usr/share/doc/gcc-12/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with-gcc-major-version-only --program-suffix=-12
--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 --enable-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-12-bTRWOB/gcc-12-12.2.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-12-bTRWOB/gcc-12-12.2.0/debian/tmp-gcn/usr
--enable-offload-defaulted --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 12.2.0 (Debian 12.2.0-14)

Complete command line:
`g++ test.cpp` or `g++ -O test.cpp`

Compiler output message for `g++ test.cpp`:
/usr/bin/ld: /tmp/ccBQx0I3.o: in function `main':
test.cpp:(.text+0x5): undefined reference to `auto foo<int>()'
collect2: error: ld returned 1 exit status

Compiler output message for `g++ -O test.cpp`:
Nothing, as compilation is successful.

Preprocessed file (*.ii) is attached.

Let me know if there is information missing.

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

* [Bug c++/109942] Function template declared extern is implicitly instantiated on -O optimization level when return type is auto
  2023-05-23 12:39 [Bug c++/109942] New: Function template declared extern is implicitly instantiated on -O optimization level when return type is auto simon-pfahler at gmx dot de
@ 2023-05-23 13:30 ` redi at gcc dot gnu.org
  2023-05-23 13:35 ` redi at gcc dot gnu.org
  2023-05-23 13:40 ` simon-pfahler at gmx dot de
  2 siblings, 0 replies; 4+ messages in thread
From: redi at gcc dot gnu.org @ 2023-05-23 13:30 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
I think it's debatable whether GCC's behaviour is incorrect. The definition of
the function template can be seen, and no explicit specialization has been
declared for foo<int>, so the compiler is allowed to inline the definition.

It *has* to instantiate it the definition, to determine the return type. Since
it has to instantiate it anyway, it might as well inline it as well.

So even if this failed to link, you wouldn't get faster compile times because
the definition must be instantiated anyway.

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

* [Bug c++/109942] Function template declared extern is implicitly instantiated on -O optimization level when return type is auto
  2023-05-23 12:39 [Bug c++/109942] New: Function template declared extern is implicitly instantiated on -O optimization level when return type is auto simon-pfahler at gmx dot de
  2023-05-23 13:30 ` [Bug c++/109942] " redi at gcc dot gnu.org
@ 2023-05-23 13:35 ` redi at gcc dot gnu.org
  2023-05-23 13:40 ` simon-pfahler at gmx dot de
  2 siblings, 0 replies; 4+ messages in thread
From: redi at gcc dot gnu.org @ 2023-05-23 13:35 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
You can add [[gnu::noinline]] to the function template if you really want to
prevent  it from being inlined, but it won't prevent it being instantiated.

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

* [Bug c++/109942] Function template declared extern is implicitly instantiated on -O optimization level when return type is auto
  2023-05-23 12:39 [Bug c++/109942] New: Function template declared extern is implicitly instantiated on -O optimization level when return type is auto simon-pfahler at gmx dot de
  2023-05-23 13:30 ` [Bug c++/109942] " redi at gcc dot gnu.org
  2023-05-23 13:35 ` redi at gcc dot gnu.org
@ 2023-05-23 13:40 ` simon-pfahler at gmx dot de
  2 siblings, 0 replies; 4+ messages in thread
From: simon-pfahler at gmx dot de @ 2023-05-23 13:40 UTC (permalink / raw)
  To: gcc-bugs

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

Simon Pfahler <simon-pfahler at gmx dot de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|---                         |WONTFIX

--- Comment #3 from Simon Pfahler <simon-pfahler at gmx dot de> ---
I see your point, and have realized that there is no way around explicitly
stating the return types. That was wishful thinking on my part.

Still, I feel like the behavior should be identical for any optimization level,
but this is more personal opinion and of little relevance for
standard-compliance.

Marked this issue as resolved, since even if it is a bug (as you said,
debatable), it certainly isn't a relevant one.

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

end of thread, other threads:[~2023-05-23 13:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-23 12:39 [Bug c++/109942] New: Function template declared extern is implicitly instantiated on -O optimization level when return type is auto simon-pfahler at gmx dot de
2023-05-23 13:30 ` [Bug c++/109942] " redi at gcc dot gnu.org
2023-05-23 13:35 ` redi at gcc dot gnu.org
2023-05-23 13:40 ` simon-pfahler at gmx dot de

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).