public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/66153] New: Internal compiler error in nested template function
@ 2015-05-15 0:21 paboyle at ph dot ed.ac.uk
2015-05-15 11:42 ` [Bug c++/66153] " paboyle at ph dot ed.ac.uk
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: paboyle at ph dot ed.ac.uk @ 2015-05-15 0:21 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
Bug ID: 66153
Summary: Internal compiler error in nested template function
Product: gcc
Version: 5.1.0
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: paboyle at ph dot ed.ac.uk
Target Milestone: ---
Created attachment 35543
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=35543&action=edit
Preprocessed source
Peters-MacBook-Pro:gcc5_debug pab$ g++-5 -std=c++11 broken.cc -o broken
'
Internal compiler error: Error reporting routines re-entered.
broken.cc: In substitution of 'template<int N, class obj> Container<decltype
(function<N>(arg.data[0]))> function(const Container<obj>&) [with int N = 1;
obj = <missing>]':
broken.cc:43:101: recursively required by substitution of 'template<int N,
class obj> Container<decltype (function<N>(arg.data[0]))> function(const
Container<obj>&) [with int N = 1; obj = <missing>]'
broken.cc:43:101: required by substitution of 'template<int N, class obj>
Container<decltype (function<N>(arg.data[0]))> function(const Container<obj>&)
[with int N = 1; obj = <missing>]'
broken.cc:45:33: Abort trap: 6
template<int N,class obj> auto function(const Container<obj> & arg)->
Container<decltype(function<N>(arg.data[0]))>
^
g++-5: internal compiler error: Abort trap: 6 (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://github.com/Homebrew/homebrew-versions/issues> for instructions.
==============
#include <vector>
#include <complex>
#include <type_traits>
#include <iostream>
typedef std::complex<double> ComplexD;
template <class T> class TypeMapper {
public:
enum { NestLevel = T::NestLevel };
};
template<> class TypeMapper<ComplexD> {
public:
enum { NestLevel = 0 };
};
template<class obj> class Container {
public:
std::vector<obj> data;
Container(int size) : data (size){};
};
template<class obj> class Recursive {
public:
enum { NestLevel = TypeMapper<obj>::NestLevel + 1};
obj internal;
};
template<int N,class obj,typename std::enable_if<N==obj::NestLevel >::type * =
nullptr > auto function(const obj &arg)-> obj
{
std::cout<<"Leaf "<<obj::NestLevel<<std::endl;
return arg;
}
template<int N,class obj,typename std::enable_if<N!=obj::NestLevel >::type * =
nullptr > auto function(const obj &arg)-> obj
{
std::cout<<"Node "<<obj::NestLevel<<std::endl;
obj ret;
ret.internal=function<N>(arg.internal);
return ret;
}
template<int N,class obj> auto function(const Container<obj> & arg)->
Container<decltype(function<N>(arg.data[0]))>
{
Container<decltype(function<N>(arg.data[0]))> ret(arg.data.size());
for(int ss=0;ss<arg.data.size();ss++){
ret.data[ss] = function<N>(arg.data[ss]);
}
return ret;
}
int main(int argc,char **argv)
{
Container<Recursive<Recursive<ComplexD> > > array(10);
Container<Recursive<Recursive<ComplexD> > > ret(10);
ret = function<1>(array);
}
==============
For reference, works on Intel 15, Clang++ multiple versions.
Peters-MacBook-Pro:gcc5_debug pab$ icpc -std=c++11 broken.cc -o broken
Peters-MacBook-Pro:gcc5_debug pab$ clang++ -std=c++11 broken.cc -o broken
Peters-MacBook-Pro:gcc5_debug pab$ clang++ --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
Peters-MacBook-Pro:gcc5_debug pab$ icpc --version
icpc (ICC) 15.0.3 20150408
Copyright (C) 1985-2015 Intel Corporation. All rights reserved.
Output with both icpc and clang++ is:
Peters-MacBook-Pro:gcc5_debug pab$ ./broken
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
Node 2
Leaf 1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
@ 2015-05-15 11:42 ` paboyle at ph dot ed.ac.uk
2015-05-16 4:41 ` paboyle at ph dot ed.ac.uk
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: paboyle at ph dot ed.ac.uk @ 2015-05-15 11:42 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
--- Comment #1 from Peter Boyle <paboyle at ph dot ed.ac.uk> ---
Created attachment 35547
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=35547&action=edit
unprocessed source code.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
2015-05-15 11:42 ` [Bug c++/66153] " paboyle at ph dot ed.ac.uk
@ 2015-05-16 4:41 ` paboyle at ph dot ed.ac.uk
2015-05-23 12:47 ` paboyle at ph dot ed.ac.uk
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: paboyle at ph dot ed.ac.uk @ 2015-05-16 4:41 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
--- Comment #2 from Peter Boyle <paboyle at ph dot ed.ac.uk> ---
p.s. in case anyone is wondering this recursive construct is
a simplification of a construct I'm using in an expression
template framework, so this is not simply a convoluted test case.
Rather, I distilled the fail down to a small case from a much larger code.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
2015-05-15 11:42 ` [Bug c++/66153] " paboyle at ph dot ed.ac.uk
2015-05-16 4:41 ` paboyle at ph dot ed.ac.uk
@ 2015-05-23 12:47 ` paboyle at ph dot ed.ac.uk
2021-12-21 21:11 ` pinskia at gcc dot gnu.org
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: paboyle at ph dot ed.ac.uk @ 2015-05-23 12:47 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
Peter Boyle <paboyle at ph dot ed.ac.uk> changed:
What |Removed |Added
----------------------------------------------------------------------------
Version|5.1.0 |6.0
--- Comment #4 from Peter Boyle <paboyle at ph dot ed.ac.uk> ---
Also fails in HEAD
prog.cc:53:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc,char **argv)
^
prog.cc:53:26: warning: unused parameter 'argv' [-Wunused-parameter]
int main(int argc,char **argv)
^
'
Internal compiler error: Error reporting routines re-entered.
0x5ccf96 push_tinst_level_loc(tree_node*, unsigned int)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:8464
0x5e8409 push_tinst_level(tree_node*)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:8448
0x5e8409 fn_type_unification(tree_node*, tree_node*, tree_node*, tree_node*
const*, unsigned int, tree_node*, unification_kind_t, int, bool, bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:16238
0x5a5be9 add_template_candidate_real
/home/heads/gcc/gcc-source/gcc/cp/call.c:3057
0x5a626c add_template_candidate
/home/heads/gcc/gcc-source/gcc/cp/call.c:3154
0x5a626c add_candidates
/home/heads/gcc/gcc-source/gcc/cp/call.c:5281
0x5a8843 perform_overload_resolution
/home/heads/gcc/gcc-source/gcc/cp/call.c:3999
0x5a9d0a build_new_function_call(tree_node*, vec<tree_node*, va_gc,
vl_embed>**, bool, int)
/home/heads/gcc/gcc-source/gcc/cp/call.c:4076
0x67114a finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
/home/heads/gcc/gcc-source/gcc/cp/semantics.c:2410
0x5d478d tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:15201
0x5d5308 tsubst(tree_node*, tree_node*, int, tree_node*)
/home/heads/gcc/gcc-source/gcc/cp/pt.c:12512
0x60dd50 dump_template_bindings
/home/heads/gcc/gcc-source/gcc/cp/error.c:369
0x60dd50 dump_substitution
/home/heads/gcc/gcc-source/gcc/cp/error.c:1448
0x60f866 decl_to_string
/home/heads/gcc/gcc-source/gcc/cp/error.c:2910
0x60f866 cp_printer
/home/heads/gcc/gcc-source/gcc/cp/error.c:3491
0xfd6a10 pp_format(pretty_printer*, text_info*)
/home/heads/gcc/gcc-source/gcc/pretty-print.c:613
0xfd7780 pp_format_verbatim(pretty_printer*, text_info*)
/home/heads/gcc/gcc-source/gcc/pretty-print.c:672
0xfd7854 pp_verbatim(pretty_printer*, char const*, ...)
/home/heads/gcc/gcc-source/gcc/pretty-print.c:873
0x609eda print_instantiation_partial_context_line
/home/heads/gcc/gcc-source/gcc/cp/error.c:3290
0x609eda print_instantiation_partial_context
/home/heads/gcc/gcc-source/gcc/cp/error.c:3400
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
` (2 preceding siblings ...)
2015-05-23 12:47 ` paboyle at ph dot ed.ac.uk
@ 2021-12-21 21:11 ` pinskia at gcc dot gnu.org
2021-12-21 21:29 ` pinskia at gcc dot gnu.org
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-12-21 21:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |rejects-valid
Severity|major |normal
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
` (3 preceding siblings ...)
2021-12-21 21:11 ` pinskia at gcc dot gnu.org
@ 2021-12-21 21:29 ` pinskia at gcc dot gnu.org
2021-12-21 21:45 ` pinskia at gcc dot gnu.org
2021-12-21 21:58 ` pinskia at gcc dot gnu.org
6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-12-21 21:29 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Reduced further:
#include <type_traits>
template <class T> struct TypeMapper { static const int NestLevel =
T::NestLevel; };
template<> struct TypeMapper<double> { static const int NestLevel = 0; };
template<class obj> struct Container { obj data; };
template<class obj> struct Recursive {
enum { NestLevel = TypeMapper<obj>::NestLevel + 1};
};
template<int N,class obj, typename std::enable_if<N==obj::NestLevel >::type *
= nullptr >
auto function(const obj &arg)-> obj
{
return arg;
}
template<int N,class obj, typename std::enable_if<N!=obj::NestLevel >::type * =
nullptr >
auto function(const obj &arg)-> obj
{
return obj{};
}
template<int N,class obj>
auto function(const Container<obj> & arg) ->
Container<decltype(function<N>(arg.data))>
{
Container<Recursive<Recursive<double> > > ret;
return ret;
}
int main(int argc,char **argv)
{
Container<Recursive<Recursive<double> > > array;
Container<Recursive<Recursive<double> > > ret;
function<1>(array);
}
----- CUT -----
I have seen another one similar to this recently.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
` (4 preceding siblings ...)
2021-12-21 21:29 ` pinskia at gcc dot gnu.org
@ 2021-12-21 21:45 ` pinskia at gcc dot gnu.org
2021-12-21 21:58 ` pinskia at gcc dot gnu.org
6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-12-21 21:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Here is the full on reduced testcase (the previous one was wrong):
template<class obj> struct Container {
obj data[1];
};
template<class obj> struct Recursive {};
template<int N,class obj> obj function(const obj &arg)
{
return obj{};
}
template<int N,class obj>
auto function(const Container<obj> & arg)
-> Container<decltype(function<N>(arg.data[0]))>
{
Container<decltype(function<N>(arg.data[0]))> ret;
return ret;
}
int main(int argc,char **argv)
{
Container<Recursive<Recursive<int> > > array;
function<1>(array);
}
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug c++/66153] Internal compiler error in nested template function
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
` (5 preceding siblings ...)
2021-12-21 21:45 ` pinskia at gcc dot gnu.org
@ 2021-12-21 21:58 ` pinskia at gcc dot gnu.org
6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-12-21 21:58 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
A little more reduced:
template<class obj> struct c { obj data; };
struct r {};
template<int N,class obj> obj g(const obj &arg);
template<int N,class obj>
auto g(const c<obj> & arg)
-> c<decltype(g<N>(arg.data))>
{
return c<decltype(g<N>(arg.data))>{};
}
int main()
{
c<r > array;
g<1>(array);
}
---- CUT ----
Without the guide for the return type, GCC accepts the code. Somehow GCC is
messing up g<N>, Removing the template argument N also allows GCC to accept the
code.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-12-21 21:58 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-15 0:21 [Bug c++/66153] New: Internal compiler error in nested template function paboyle at ph dot ed.ac.uk
2015-05-15 11:42 ` [Bug c++/66153] " paboyle at ph dot ed.ac.uk
2015-05-16 4:41 ` paboyle at ph dot ed.ac.uk
2015-05-23 12:47 ` paboyle at ph dot ed.ac.uk
2021-12-21 21:11 ` pinskia at gcc dot gnu.org
2021-12-21 21:29 ` pinskia at gcc dot gnu.org
2021-12-21 21:45 ` pinskia at gcc dot gnu.org
2021-12-21 21:58 ` pinskia 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).