diff options
author | Jason Merrill <jason@redhat.com> | 2018-02-23 08:32:41 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-02-23 08:32:41 -0500 |
commit | 54fbd24d8eee02af48624d091452d9267887f722 (patch) | |
tree | fbc07790e6c6abf18fbebf72473a01abcff45ac9 /gcc | |
parent | c287dea0c4a9319979288995e449c09184528a2f (diff) | |
download | gcc-54fbd24d8eee02af48624d091452d9267887f722.zip gcc-54fbd24d8eee02af48624d091452d9267887f722.tar.gz gcc-54fbd24d8eee02af48624d091452d9267887f722.tar.bz2 |
PR c++/70468 - ICE with constructor delegation via typedef.
* pt.c (tsubst_initializer_list): Check for other mem-initializers
with constructor delegation.
From-SVN: r257931
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/dc9.C | 30 |
3 files changed, 59 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 79b7f00..58710a9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2018-02-22 Jason Merrill <jason@redhat.com> + PR c++/70468 - ICE with constructor delegation via typedef. + * pt.c (tsubst_initializer_list): Check for other mem-initializers + with constructor delegation. + +2018-02-22 Jason Merrill <jason@redhat.com> + PR c++/84424 - ICE with constexpr and __builtin_shuffle. * constexpr.c (reduced_constant_expression_p): Handle CONSTRUCTOR of VECTOR_TYPE. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bc03f0e..85d1adb 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -23558,6 +23558,7 @@ static tree tsubst_initializer_list (tree t, tree argvec) { tree inits = NULL_TREE; + tree target_ctor = error_mark_node; for (; t; t = TREE_CHAIN (t)) { @@ -23674,6 +23675,28 @@ tsubst_initializer_list (tree t, tree argvec) in_base_initializer = 0; } + if (target_ctor != error_mark_node + && init != error_mark_node) + { + error ("mem-initializer for %qD follows constructor delegation", + decl); + return inits; + } + /* Look for a target constructor. */ + if (init != error_mark_node + && decl && CLASS_TYPE_P (decl) + && same_type_p (decl, current_class_type)) + { + maybe_warn_cpp0x (CPP0X_DELEGATING_CTORS); + if (inits) + { + error ("constructor delegation follows mem-initializer for %qD", + TREE_PURPOSE (inits)); + continue; + } + target_ctor = init; + } + if (decl) { init = build_tree_list (decl, init); diff --git a/gcc/testsuite/g++.dg/cpp0x/dc9.C b/gcc/testsuite/g++.dg/cpp0x/dc9.C new file mode 100644 index 0000000..b87f5ce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc9.C @@ -0,0 +1,30 @@ +// PR c++/70468 +// { dg-do compile { target c++11 } } +// { dg-additional-options -w } + +struct S {}; + +template < typename = S > +class A +{ +public: + A () : f0 (), f1 () {} // { dg-error "" } + +private: + typedef A<> f0; + int f1; +}; + +template < typename = S, typename = S > +class B +{ +}; + +template < typename T1, typename T2 > +B < T1, T2 > &operator<< (B < T1, T2 >&, const int) +{ + A<> (); +} + +template +B < S, S > &operator<< (B < S, S >&, const int); |