re PR c++/79372 (ICE on C++ code with illegal decomposition declaration on x86_64-linux-gnu: in tsubst_decomp_names, at cp/pt.c:15599)
PR c++/79372 * decl.c (cp_finish_decomp): On error set decl type to error_mark_node. * pt.c (tsubst_expr): Don't call tsubst_decomp_names on decompositions with error_mark_node type. * g++.dg/cpp1z/decomp25.C: New test. From-SVN: r245218
This commit is contained in:
parent
6f26f15f13
commit
a5e8cbd150
|
@ -1,3 +1,10 @@
|
|||
2017-02-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/79372
|
||||
* decl.c (cp_finish_decomp): On error set decl type to error_mark_node.
|
||||
* pt.c (tsubst_expr): Don't call tsubst_decomp_names on decompositions
|
||||
with error_mark_node type.
|
||||
|
||||
2017-02-03 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/78689 - ICE on constructor with label
|
||||
|
|
|
@ -7378,6 +7378,7 @@ cp_finish_decomp (tree decl, tree first, unsigned int count)
|
|||
}
|
||||
first = DECL_CHAIN (first);
|
||||
}
|
||||
TREE_TYPE (decl) = error_mark_node;
|
||||
if (DECL_P (decl) && DECL_NAMESPACE_SCOPE_P (decl))
|
||||
SET_DECL_ASSEMBLER_NAME (decl, get_identifier ("<decomp>"));
|
||||
return;
|
||||
|
|
|
@ -15765,7 +15765,9 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
|
|||
const_init = (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P
|
||||
(pattern_decl));
|
||||
cp_finish_decl (decl, init, const_init, NULL_TREE, 0);
|
||||
if (VAR_P (decl) && DECL_DECOMPOSITION_P (decl))
|
||||
if (VAR_P (decl)
|
||||
&& DECL_DECOMPOSITION_P (decl)
|
||||
&& TREE_TYPE (pattern_decl) != error_mark_node)
|
||||
{
|
||||
unsigned int cnt;
|
||||
tree first;
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2017-02-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/79372
|
||||
* g++.dg/cpp1z/decomp25.C: New test.
|
||||
|
||||
PR tree-optimization/79284
|
||||
* gcc.c-torture/compile/pr79284.c: New test.
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// PR c++/79372
|
||||
// { dg-do compile { target c++11 } }
|
||||
// { dg-options "" }
|
||||
|
||||
template <typename T>
|
||||
struct S
|
||||
{
|
||||
enum E { A };
|
||||
void f () { auto [x] = 0; x++; } // { dg-error "cannot decompose non-array non-class type" }
|
||||
// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
|
||||
void g (T t) { auto [y] = t; y++; } // { dg-error "cannot decompose non-array non-class type" }
|
||||
}; // { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
S <int> s;
|
||||
s.f ();
|
||||
s.g (5);
|
||||
}
|
Loading…
Reference in New Issue