[Bug c++/69694] New: type incomplete depending if constructing function is templated
bloerwald at googlemail dot com
gcc-bugzilla@gcc.gnu.org
Fri Feb 5 14:38:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69694
Bug ID: 69694
Summary: type incomplete depending if constructing function is
templated
Product: gcc
Version: 5.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: bloerwald at googlemail dot com
Target Milestone: ---
Created attachment 37595
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37595&action=edit
source file triggering the bug when compiled with -DA
Depending on whether or not the function creating an object of Fun<Tag> is a
template or not, Fun<Tag> is either incomplete or not, in the snippet below. In
addition, once it is referenced from a non-templated function, it is no longer
incomplete in following templated functions.
$ gcc/5.3.0/bin/g++ -fno-strict-aliasing -fwrapv -W -Wall -Werror -Wextra
-std=c++11 -c snippet.cpp -DA
snippet.cpp: In function ‘void a()’:
snippet.cpp:24:44: error: invalid use of incomplete type ‘struct Fun<Tag>’
template<typename> void a() { Fun<Tag> {}.fun(); }
^
snippet.cpp:8:46: note: declaration of ‘struct Fun<Tag>’
template<typename, typename = void> struct Fun;
The definitions -DA, -DB, -DC can be used to demonstrate the effect of "once
referenced from non-templated" described above:
-DA: a fails
-DB: success
-DC: c fails
-DA -DB: a fails
-DA -DC: a and c fail
-DB -DC: success (c is fine!)
-DA -DB -DC: a fails, c is fine
Also fails with gcc 4.9.2, succeeds with clang 3.5.1/3.7.1.
Replacing `void fun();` with `void operator()();` and the calls with
`Fun<Tag>{}();` lets the error message degrade to "no match for call to
‘(Fun<Tag>) ()’" (note the braces around Fun<Tag>).
More information about the Gcc-bugs
mailing list