- implemented GNU ?: operator (no ast2firm support yet
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Mon, 1 Sep 2008 01:03:43 +0000 (01:03 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Mon, 1 Sep 2008 01:03:43 +0000 (01:03 +0000)
[r21616]

ast.c
parser.c

diff --git a/ast.c b/ast.c
index 3f597b3..34d9637 100644 (file)
--- 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);
 }
index baa943a..45d0d8e 100644 (file)
--- 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;