Bug 48969 - ICE with -std=c++0x
Summary: ICE with -std=c++0x
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.6.0
: P3 normal
Target Milestone: 4.7.0
Assignee: Jason Merrill
URL:
Keywords: ice-on-valid-code
: 48285 (view as bug list)
Depends on:
Blocks:
 
Reported: 2011-05-11 20:49 UTC by ajrh
Modified: 2011-06-07 21:54 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2011-05-11 22:30:49


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description ajrh 2011-05-11 20:49:32 UTC
The file below compiles OK if the -std=c++0x flag is not passed

g++ -c -std=c++0x x.cpp
g++: internal compiler error: Segmentation fault (program cc1plus)
Please submit a full bug report, [...]

===========

template<unsigned int N> struct Pair { };
struct Foo { enum { Mask = 1 }; } foo;
template<typename A, typename B> class Pair<A::Mask | B::Mask> operator|(const A &, const B &)
{
    foo | foo;
};
Comment 1 Jonathan Wakely 2011-05-12 08:56:57 UTC
it looks like tsubst recurses until it runs out of stack

clang also segfaults with -std=c++0x, and not without
Comment 2 Jason Merrill 2011-05-13 16:51:24 UTC
Yes, the problem arises because in C++0x enums have scope, so decltype(Foo::Mask)::Mask is the same as Foo::Mask.
Comment 3 Jason Merrill 2011-05-13 22:25:16 UTC
Author: jason
Date: Fri May 13 22:25:12 2011
New Revision: 173741

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=173741
Log:
	PR c++/48969
	* pt.c (deduction_tsubst_fntype): New.
	(fn_type_unification): Use it.

Added:
    trunk/gcc/testsuite/g++.dg/cpp0x/decltype26.C
    trunk/gcc/testsuite/g++.dg/cpp0x/enum11.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/pt.c
    trunk/gcc/testsuite/ChangeLog
Comment 4 Jason Merrill 2011-05-16 20:52:24 UTC
Author: jason
Date: Mon May 16 20:52:18 2011
New Revision: 173805

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=173805
Log:
	PR c++/48969
	* pt.c (deduction_tsubst_fntype): Use a VEC initially.

Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/pt.c
Comment 5 Jason Merrill 2011-05-22 19:04:01 UTC
*** Bug 48285 has been marked as a duplicate of this bug. ***
Comment 6 Jason Merrill 2011-05-25 01:15:12 UTC
Fixed for 4.7.0.
Comment 7 Jason Merrill 2011-05-25 01:22:22 UTC
.
Comment 8 Jason Merrill 2011-06-07 21:54:12 UTC
Author: jason
Date: Tue Jun  7 21:54:07 2011
New Revision: 174772

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=174772
Log:
	PR c++/48969
	PR c++/44175
gcc/c-family/
	* c-common.c (max_tinst_depth): Lower default to 900.
gcc/cp/
	* error.c (subst_to_string): New.
	(cp_printer): Use it for 'S'.
	(print_instantiation_partial_context_line): Handle subst context.
	* pt.c (push_tinst_level): Handle subst context.
	(deduction_tsubst_fntype): Don't track specific substitutions.
	Use push_tinst_level.

Modified:
    trunk/gcc/c-family/ChangeLog
    trunk/gcc/c-family/c-common.c
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/error.c
    trunk/gcc/cp/pt.c
    trunk/gcc/doc/invoke.texi
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/g++.dg/abi/mangle11.C
    trunk/gcc/testsuite/g++.dg/abi/mangle12.C
    trunk/gcc/testsuite/g++.dg/abi/mangle17.C
    trunk/gcc/testsuite/g++.dg/abi/mangle20-2.C
    trunk/gcc/testsuite/g++.dg/abi/pragma-pack1.C
    trunk/gcc/testsuite/g++.dg/cpp0x/decltype26.C
    trunk/gcc/testsuite/g++.dg/cpp0x/decltype28.C
    trunk/gcc/testsuite/g++.dg/cpp0x/decltype29.C
    trunk/gcc/testsuite/g++.dg/cpp0x/enum11.C
    trunk/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C
    trunk/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C
    trunk/gcc/testsuite/g++.dg/cpp0x/pr47416.C
    trunk/gcc/testsuite/g++.dg/ext/case-range2.C
    trunk/gcc/testsuite/g++.dg/ext/case-range3.C
    trunk/gcc/testsuite/g++.dg/gomp/for-19.C
    trunk/gcc/testsuite/g++.dg/gomp/pr37533.C
    trunk/gcc/testsuite/g++.dg/gomp/pr38639.C
    trunk/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C
    trunk/gcc/testsuite/g++.dg/inherit/base3.C
    trunk/gcc/testsuite/g++.dg/inherit/using6.C
    trunk/gcc/testsuite/g++.dg/init/placement4.C
    trunk/gcc/testsuite/g++.dg/init/reference3.C
    trunk/gcc/testsuite/g++.dg/lookup/scoped6.C
    trunk/gcc/testsuite/g++.dg/lookup/using7.C
    trunk/gcc/testsuite/g++.dg/other/abstract1.C
    trunk/gcc/testsuite/g++.dg/other/error10.C
    trunk/gcc/testsuite/g++.dg/other/error5.C
    trunk/gcc/testsuite/g++.dg/other/field1.C
    trunk/gcc/testsuite/g++.dg/other/offsetof5.C
    trunk/gcc/testsuite/g++.dg/parse/bitfield2.C
    trunk/gcc/testsuite/g++.dg/parse/constant4.C
    trunk/gcc/testsuite/g++.dg/parse/crash20.C
    trunk/gcc/testsuite/g++.dg/parse/invalid-op1.C
    trunk/gcc/testsuite/g++.dg/parse/non-dependent2.C
    trunk/gcc/testsuite/g++.dg/parse/template18.C
    trunk/gcc/testsuite/g++.dg/tc1/dr152.C
    trunk/gcc/testsuite/g++.dg/tc1/dr166.C
    trunk/gcc/testsuite/g++.dg/tc1/dr176.C
    trunk/gcc/testsuite/g++.dg/tc1/dr213.C
    trunk/gcc/testsuite/g++.dg/template/access11.C
    trunk/gcc/testsuite/g++.dg/template/access2.C
    trunk/gcc/testsuite/g++.dg/template/access3.C
    trunk/gcc/testsuite/g++.dg/template/access7.C
    trunk/gcc/testsuite/g++.dg/template/arg7.C
    trunk/gcc/testsuite/g++.dg/template/cond2.C
    trunk/gcc/testsuite/g++.dg/template/crash13.C
    trunk/gcc/testsuite/g++.dg/template/crash40.C
    trunk/gcc/testsuite/g++.dg/template/crash7.C
    trunk/gcc/testsuite/g++.dg/template/crash84.C
    trunk/gcc/testsuite/g++.dg/template/ctor5.C
    trunk/gcc/testsuite/g++.dg/template/defarg13.C
    trunk/gcc/testsuite/g++.dg/template/defarg14.C
    trunk/gcc/testsuite/g++.dg/template/dtor7.C
    trunk/gcc/testsuite/g++.dg/template/eh2.C
    trunk/gcc/testsuite/g++.dg/template/error2.C
    trunk/gcc/testsuite/g++.dg/template/error43.C
    trunk/gcc/testsuite/g++.dg/template/friend32.C
    trunk/gcc/testsuite/g++.dg/template/injected1.C
    trunk/gcc/testsuite/g++.dg/template/instantiate1.C
    trunk/gcc/testsuite/g++.dg/template/instantiate3.C
    trunk/gcc/testsuite/g++.dg/template/instantiate5.C
    trunk/gcc/testsuite/g++.dg/template/instantiate7.C
    trunk/gcc/testsuite/g++.dg/template/local6.C
    trunk/gcc/testsuite/g++.dg/template/lookup2.C
    trunk/gcc/testsuite/g++.dg/template/member5.C
    trunk/gcc/testsuite/g++.dg/template/memfriend15.C
    trunk/gcc/testsuite/g++.dg/template/memfriend16.C
    trunk/gcc/testsuite/g++.dg/template/memfriend17.C
    trunk/gcc/testsuite/g++.dg/template/memfriend7.C
    trunk/gcc/testsuite/g++.dg/template/meminit1.C
    trunk/gcc/testsuite/g++.dg/template/nested3.C
    trunk/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C
    trunk/gcc/testsuite/g++.dg/template/nontype12.C
    trunk/gcc/testsuite/g++.dg/template/nontype13.C
    trunk/gcc/testsuite/g++.dg/template/nontype6.C
    trunk/gcc/testsuite/g++.dg/template/pr23510.C
    trunk/gcc/testsuite/g++.dg/template/pr35240.C
    trunk/gcc/testsuite/g++.dg/template/ptrmem15.C
    trunk/gcc/testsuite/g++.dg/template/ptrmem6.C
    trunk/gcc/testsuite/g++.dg/template/qualified-id1.C
    trunk/gcc/testsuite/g++.dg/template/qualttp20.C
    trunk/gcc/testsuite/g++.dg/template/qualttp3.C
    trunk/gcc/testsuite/g++.dg/template/qualttp4.C
    trunk/gcc/testsuite/g++.dg/template/qualttp5.C
    trunk/gcc/testsuite/g++.dg/template/qualttp6.C
    trunk/gcc/testsuite/g++.dg/template/qualttp7.C
    trunk/gcc/testsuite/g++.dg/template/qualttp8.C
    trunk/gcc/testsuite/g++.dg/template/recurse.C
    trunk/gcc/testsuite/g++.dg/template/recurse2.C
    trunk/gcc/testsuite/g++.dg/template/ref5.C
    trunk/gcc/testsuite/g++.dg/template/scope2.C
    trunk/gcc/testsuite/g++.dg/template/sfinae10.C
    trunk/gcc/testsuite/g++.dg/template/sfinae3.C
    trunk/gcc/testsuite/g++.dg/template/sizeof3.C
    trunk/gcc/testsuite/g++.dg/template/static9.C
    trunk/gcc/testsuite/g++.dg/template/template-id-2.C
    trunk/gcc/testsuite/g++.dg/template/typedef13.C
    trunk/gcc/testsuite/g++.dg/template/typename4.C
    trunk/gcc/testsuite/g++.dg/template/using14.C
    trunk/gcc/testsuite/g++.dg/template/using2.C
    trunk/gcc/testsuite/g++.dg/template/warn1.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-13.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-15.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-16.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-17.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-18.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-19.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-20.C
    trunk/gcc/testsuite/g++.dg/warn/Wparentheses-23.C
    trunk/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C
    trunk/gcc/testsuite/g++.dg/warn/noeffect2.C
    trunk/gcc/testsuite/g++.dg/warn/noeffect4.C
    trunk/gcc/testsuite/g++.dg/warn/pr8570.C
    trunk/gcc/testsuite/g++.old-deja/g++.brendan/init2.C
    trunk/gcc/testsuite/g++.old-deja/g++.eh/spec6.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/crash10.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/crash36.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/derived3.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/error2.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/explicit70.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/infinite1.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/memtemp89.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/overload7.C
    trunk/gcc/testsuite/g++.old-deja/g++.pt/vaarg3.C
    trunk/gcc/testsuite/lib/prune.exp
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg1.cc
    trunk/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg2.cc
    trunk/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg3.cc
    trunk/libstdc++-v3/testsuite/20_util/forward/1_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/ratio/cons/cons_overflow_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc
    trunk/libstdc++-v3/testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc
    trunk/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc
    trunk/libstdc++-v3/testsuite/ext/pb_ds/example/hash_resize_neg.cc
    trunk/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_floating_neg.cc
    trunk/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_integer_neg.cc
    trunk/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_floating_neg.cc
    trunk/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_integer_neg.cc
    trunk/libstdc++-v3/testsuite/lib/prune.exp
    trunk/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc