mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/55520 ([C++11] ICE when capturing a variable-length stack array in lambda; in expand_expr_real_1, at expr.c:9122)
PR c++/55520 * semantics.c (add_capture): Diagnose capture of variable-size type that is not a C++1y array of runtime bound. From-SVN: r199780
This commit is contained in:
parent
e765a228a5
commit
a9429737bd
|
|
@ -1,5 +1,9 @@
|
||||||
2013-06-06 Jason Merrill <jason@redhat.com>
|
2013-06-06 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/55520
|
||||||
|
* semantics.c (add_capture): Diagnose capture of variable-size
|
||||||
|
type that is not a C++1y array of runtime bound.
|
||||||
|
|
||||||
* decl.c (grokdeclarator): Keep a decl with error type.
|
* decl.c (grokdeclarator): Keep a decl with error type.
|
||||||
(grokfield, grokbitfield): Likewise.
|
(grokfield, grokbitfield): Likewise.
|
||||||
* pt.c (instantiate_class_template_1): Likewise.
|
* pt.c (instantiate_class_template_1): Likewise.
|
||||||
|
|
|
||||||
|
|
@ -9487,6 +9487,15 @@ add_capture (tree lambda, tree id, tree initializer, bool by_reference_p,
|
||||||
nelts_field, array_type_nelts (type));
|
nelts_field, array_type_nelts (type));
|
||||||
type = ctype;
|
type = ctype;
|
||||||
}
|
}
|
||||||
|
else if (variably_modified_type_p (type, NULL_TREE))
|
||||||
|
{
|
||||||
|
error ("capture of variable-size type %qT that is not a C++1y array "
|
||||||
|
"of runtime bound", type);
|
||||||
|
if (TREE_CODE (type) == ARRAY_TYPE
|
||||||
|
&& variably_modified_type_p (TREE_TYPE (type), NULL_TREE))
|
||||||
|
inform (input_location, "because the array element type %qT has "
|
||||||
|
"variable size", TREE_TYPE (type));
|
||||||
|
}
|
||||||
else if (by_reference_p)
|
else if (by_reference_p)
|
||||||
{
|
{
|
||||||
type = build_reference_type (type);
|
type = build_reference_type (type);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
// PR c++/55520
|
||||||
|
// { dg-options "-Wno-vla" }
|
||||||
|
// { dg-require-effective-target c++11 }
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
int x[1][argc];
|
||||||
|
|
||||||
|
[&x](int i) { // { dg-error "variable.size" }
|
||||||
|
x[0][i] = 0; // { dg-prune-output "assignment" }
|
||||||
|
}(5);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue