issue a warning if returning the address of a local variable
[cparser] / ast.c
diff --git a/ast.c b/ast.c
index 6a4f111..073ab7d 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -14,6 +14,7 @@ struct obstack ast_obstack;
 
 static FILE *out;
 static int   indent;
+static int   print_implicit_casts = 1;
 
 static void print_statement(const statement_t *statement);
 
@@ -203,6 +204,10 @@ static void print_unary_expression(const unary_expression_t *unexpr)
        case EXPR_UNARY_DEREFERENCE:      fputs("*", out);  break;
        case EXPR_UNARY_TAKE_ADDRESS:     fputs("&", out);  break;
 
+       case EXPR_UNARY_BITFIELD_EXTRACT:
+               print_expression(unexpr->value);
+               return;
+
        case EXPR_UNARY_POSTFIX_INCREMENT:
                fputs("(", out);
                print_expression(unexpr->value);
@@ -215,14 +220,17 @@ static void print_unary_expression(const unary_expression_t *unexpr)
                fputs(")", out);
                fputs("--", out);
                return;
+       case EXPR_UNARY_CAST_IMPLICIT:
+               if(!print_implicit_casts) {
+                       print_expression(unexpr->value);
+                       return;
+               }
+               /* fallthrough */
        case EXPR_UNARY_CAST:
                fputs("(", out);
                print_type(unexpr->expression.datatype);
                fputs(")", out);
                break;
-       case EXPR_UNARY_CAST_IMPLICIT:
-               print_expression(unexpr->value);
-               return;
        case EXPR_UNARY_ASSUME:
                fputs("__assume", out);
                break;
@@ -861,6 +869,7 @@ bool is_constant_expression(const expression_t *expression)
        case EXPR_UNARY_POSTFIX_DECREMENT:
        case EXPR_UNARY_PREFIX_INCREMENT:
        case EXPR_UNARY_PREFIX_DECREMENT:
+       case EXPR_UNARY_BITFIELD_EXTRACT:
        case EXPR_UNARY_ASSUME: /* has VOID type */
        case EXPR_BINARY_ASSIGN:
        case EXPR_BINARY_MUL_ASSIGN: