From: Michael Beck Date: Mon, 1 Sep 2008 01:03:43 +0000 (+0000) Subject: - implemented GNU ?: operator (no ast2firm support yet X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=003c9506db3d8db7060f7d651d056220f992b543;p=cparser - implemented GNU ?: operator (no ast2firm support yet [r21616] --- diff --git a/ast.c b/ast.c index 3f597b3..34d9637 100644 --- a/ast.c +++ b/ast.c @@ -588,8 +588,12 @@ static void print_conditional(const conditional_expression_t *expression) fputs("(", out); print_expression_prec(expression->condition, prec); fputs(" ? ", out); - print_expression_prec(expression->true_expression, prec); - fputs(" : ", out); + if (expression->true_expression != NULL) { + print_expression_prec(expression->true_expression, prec); + fputs(" : ", out); + } else { + fputs(": ", out); + } print_expression_prec(expression->false_expression, prec); fputs(")", out); } diff --git a/parser.c b/parser.c index baa943a..45d0d8e 100644 --- a/parser.c +++ b/parser.c @@ -3230,7 +3230,7 @@ static void parse_declaration_specifiers(declaration_specifiers_t *specifiers) case T__forceinline: /* ^ DECLARATION_START except for __attribute__ */ case T_IDENTIFIER: case '*': - errorf(HERE, "discarding stray %K in declaration specifer", &token); + errorf(HERE, "discarding stray %K in declaration specifier", &token); next_token(); continue; @@ -6861,7 +6861,12 @@ static expression_t *parse_conditional_expression(unsigned precedence, &expression->base.source_position, condition_type_orig); } - expression_t *true_expression = parse_expression(); + expression_t *true_expression = expression; + bool gnu_cond = false; + if ((c_mode & _GNUC) && token.type == ':') { + gnu_cond = true; + } else + true_expression = parse_expression(); rem_anchor_token(':'); expect(':'); expression_t *false_expression = parse_sub_expression(precedence); @@ -6958,7 +6963,7 @@ static expression_t *parse_conditional_expression(unsigned precedence, } conditional->true_expression - = create_implicit_cast(true_expression, result_type); + = gnu_cond ? NULL : create_implicit_cast(true_expression, result_type); conditional->false_expression = create_implicit_cast(false_expression, result_type); conditional->base.type = result_type;