Commit c5fed5c6 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/78089 (__builtin_shuffle parsing bug)

	PR c++/78089
	* parser.c (cp_parser_postfix_expression): Replace return statement in
	the first switch with setting postfix_expression to the return
	expression and break;.

	* c-c++-common/builtin-shuffle-1.c: New test.
	* g++.dg/cpp0x/addressof3.C: New test.

From-SVN: r241710
parent f04c1e0a
2016-10-31 Jakub Jelinek <jakub@redhat.com> 2016-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/78089
* parser.c (cp_parser_postfix_expression): Replace return statement in
the first switch with setting postfix_expression to the return
expression and break;.
PR c++/77886 PR c++/77886
* g++.dg/warn/Wimplicit-fallthrough-2.C: New test. * g++.dg/warn/Wimplicit-fallthrough-2.C: New test.
......
...@@ -6441,7 +6441,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6441,7 +6441,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
can be used in constant-expressions. */ can be used in constant-expressions. */
if (!cast_valid_in_integral_constant_expression_p (type) if (!cast_valid_in_integral_constant_expression_p (type)
&& cp_parser_non_integral_constant_expression (parser, NIC_CAST)) && cp_parser_non_integral_constant_expression (parser, NIC_CAST))
return error_mark_node; {
postfix_expression = error_mark_node;
break;
}
switch (keyword) switch (keyword)
{ {
...@@ -6521,7 +6524,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6521,7 +6524,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
parser->type_definition_forbidden_message = saved_message; parser->type_definition_forbidden_message = saved_message;
/* `typeid' may not appear in an integral constant expression. */ /* `typeid' may not appear in an integral constant expression. */
if (cp_parser_non_integral_constant_expression (parser, NIC_TYPEID)) if (cp_parser_non_integral_constant_expression (parser, NIC_TYPEID))
return error_mark_node; postfix_expression = error_mark_node;
} }
break; break;
...@@ -6615,7 +6618,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6615,7 +6618,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
/*cast_p=*/false, /*allow_expansion_p=*/true, /*cast_p=*/false, /*allow_expansion_p=*/true,
/*non_constant_p=*/NULL); /*non_constant_p=*/NULL);
if (vec == NULL) if (vec == NULL)
return error_mark_node; {
postfix_expression = error_mark_node;
break;
}
FOR_EACH_VEC_ELT (*vec, i, p) FOR_EACH_VEC_ELT (*vec, i, p)
mark_exp_read (p); mark_exp_read (p);
...@@ -6624,10 +6630,15 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6624,10 +6630,15 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
{ {
case RID_ADDRESSOF: case RID_ADDRESSOF:
if (vec->length () == 1) if (vec->length () == 1)
return cp_build_addressof (loc, (*vec)[0], tf_warning_or_error); postfix_expression
error_at (loc, "wrong number of arguments to " = cp_build_addressof (loc, (*vec)[0], tf_warning_or_error);
"%<__builtin_addressof%>"); else
return error_mark_node; {
error_at (loc, "wrong number of arguments to "
"%<__builtin_addressof%>");
postfix_expression = error_mark_node;
}
break;
case RID_BUILTIN_LAUNDER: case RID_BUILTIN_LAUNDER:
if (vec->length () == 1) if (vec->length () == 1)
...@@ -6643,14 +6654,20 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6643,14 +6654,20 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
case RID_BUILTIN_SHUFFLE: case RID_BUILTIN_SHUFFLE:
if (vec->length () == 2) if (vec->length () == 2)
return build_x_vec_perm_expr (loc, (*vec)[0], NULL_TREE, postfix_expression
(*vec)[1], tf_warning_or_error); = build_x_vec_perm_expr (loc, (*vec)[0], NULL_TREE,
(*vec)[1], tf_warning_or_error);
else if (vec->length () == 3) else if (vec->length () == 3)
return build_x_vec_perm_expr (loc, (*vec)[0], (*vec)[1], postfix_expression
(*vec)[2], tf_warning_or_error); = build_x_vec_perm_expr (loc, (*vec)[0], (*vec)[1],
error_at (loc, "wrong number of arguments to " (*vec)[2], tf_warning_or_error);
"%<__builtin_shuffle%>"); else
return error_mark_node; {
error_at (loc, "wrong number of arguments to "
"%<__builtin_shuffle%>");
postfix_expression = error_mark_node;
}
break;
default: default:
gcc_unreachable (); gcc_unreachable ();
2016-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/78089
* c-c++-common/builtin-shuffle-1.c: New test.
* g++.dg/cpp0x/addressof3.C: New test.
2016-10-31 Ville Voutilainen <ville.voutilainen@gmail.com> 2016-10-31 Ville Voutilainen <ville.voutilainen@gmail.com>
Add tests for a const member and a reference member for launder. Add tests for a const member and a reference member for launder.
......
/* PR c++/78089 */
/* { dg-do run } */
typedef int V __attribute__((vector_size (16)));
V a, b, c;
int
foo ()
{
return __builtin_shuffle (a, b, c)[3];
}
int
main ()
{
a = (V) { 1, 2, 3, 4 };
b = (V) { 5, 6, 7, 8 };
c = (V) { 7, 2, 5, 6 };
if (foo () != 7)
__builtin_abort ();
return 0;
}
// { dg-do compile }
struct S { int foo (); int s; };
int a[10];
int b;
S c;
int d = __builtin_addressof (a)[0][0];
int e = __builtin_addressof (b)[0];
int f = __builtin_addressof (c)->foo ();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment