diff options
author | Richard Biener <rguenther@suse.de> | 2019-05-15 12:51:58 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-05-15 12:51:58 +0000 |
commit | 186dabf2926eb049e9a954dae6fa765687dc353c (patch) | |
tree | ea83973516ee3b335eff72cd7babf0abc345356c /gcc/c/gimple-parser.c | |
parent | fb4b60c68edf7196770fdc65b3862662bc2d647b (diff) | |
download | gcc-186dabf2926eb049e9a954dae6fa765687dc353c.zip gcc-186dabf2926eb049e9a954dae6fa765687dc353c.tar.gz gcc-186dabf2926eb049e9a954dae6fa765687dc353c.tar.bz2 |
gimple-parser.c (c_parser_gimple_postfix_expression): Handle __BIT_FIELD_REF.
2019-05-15 Richard Biener <rguenther@suse.de>
c/
* gimple-parser.c (c_parser_gimple_postfix_expression): Handle
__BIT_FIELD_REF.
* tree-pretty-print.c (dump_generic_node): Dump BIT_FIELD_REF
as __BIT_FIELD_REF with type with -gimple.
* gcc.dg/gimplefe-40.c: Amend.
From-SVN: r271208
Diffstat (limited to 'gcc/c/gimple-parser.c')
-rw-r--r-- | gcc/c/gimple-parser.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index 7c1f1a9..07ec1e4 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -1415,6 +1415,43 @@ c_parser_gimple_postfix_expression (gimple_parser &parser) } break; } + else if (strcmp (IDENTIFIER_POINTER (id), "__BIT_FIELD_REF") == 0) + { + /* __BIT_FIELD_REF '<' type-name [ ',' number ] '>' + '(' postfix-expression, integer, integer ')' */ + location_t loc = c_parser_peek_token (parser)->location; + c_parser_consume_token (parser); + tree type = c_parser_gimple_typespec (parser); + if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) + { + c_expr op0 = c_parser_gimple_postfix_expression (parser); + c_parser_skip_until_found (parser, CPP_COMMA, + "expected %<,%>"); + c_expr op1 = c_parser_gimple_postfix_expression (parser); + if (TREE_CODE (op1.value) != INTEGER_CST + || !int_fits_type_p (op1.value, bitsizetype)) + c_parser_error (parser, "expected constant size"); + c_parser_skip_until_found (parser, CPP_COMMA, + "expected %<,%>"); + c_expr op2 = c_parser_gimple_postfix_expression (parser); + if (TREE_CODE (op2.value) != INTEGER_CST + || !int_fits_type_p (op2.value, bitsizetype)) + c_parser_error (parser, "expected constant offset"); + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, + "expected %<)%>"); + if (type + && op0.value != error_mark_node + && TREE_CODE (op1.value) == INTEGER_CST + && TREE_CODE (op2.value) == INTEGER_CST) + expr.value = build3_loc (loc, BIT_FIELD_REF, type, + op0.value, + fold_convert (bitsizetype, + op1.value), + fold_convert (bitsizetype, + op2.value)); + } + break; + } else if (strcmp (IDENTIFIER_POINTER (id), "_Literal") == 0) { /* _Literal '(' type-name ')' ( [ '-' ] constant | constructor ) */ |