Fix parsing of function-like syntax elements.
[cparser] / parser.c
index 0dde06f..5f7de31 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -180,6 +180,8 @@ static size_t get_expression_struct_size(expression_kind_t type)
                [EXPR_FUNCTION]            = sizeof(string_literal_expression_t),
                [EXPR_PRETTY_FUNCTION]     = sizeof(string_literal_expression_t),
                [EXPR_BUILTIN_SYMBOL]      = sizeof(builtin_symbol_expression_t),
+               [EXPR_BUILTIN_CONSTANT_P]  = sizeof(builtin_constant_expression_t),
+               [EXPR_BUILTIN_PREFETCH]    = sizeof(builtin_prefetch_expression_t),
                [EXPR_OFFSETOF]            = sizeof(offsetof_expression_t),
                [EXPR_VA_START]            = sizeof(va_start_expression_t),
                [EXPR_VA_ARG]              = sizeof(va_arg_expression_t),
@@ -3177,6 +3179,42 @@ static expression_t *parse_builtin_symbol(void)
        return expression;
 }
 
+static expression_t *parse_builtin_constant(void)
+{
+       eat(T___builtin_constant_p);
+
+       expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_CONSTANT_P);
+
+       expect('(');
+       expression->builtin_constant.value = parse_assignment_expression();
+       expect(')');
+       expression->base.datatype = type_int;
+
+       return expression;
+}
+
+static expression_t *parse_builtin_prefetch(void)
+{
+       eat(T___builtin_prefetch);
+
+       expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_PREFETCH);
+
+       expect('(');
+       expression->builtin_prefetch.adr = parse_assignment_expression();
+       if (token.type == ',') {
+               next_token();
+               expression->builtin_prefetch.rw = parse_assignment_expression();
+       }
+       if (token.type == ',') {
+               next_token();
+               expression->builtin_prefetch.locality = parse_assignment_expression();
+       }
+       expect(')');
+       expression->base.datatype = type_void;
+
+       return expression;
+}
+
 static expression_t *parse_compare_builtin(void)
 {
        expression_t *expression;
@@ -3254,7 +3292,7 @@ static expression_t *parse_assume(void) {
                = allocate_expression_zero(EXPR_UNARY_ASSUME);
 
        expect('(');
-       expression->unary.value = parse_expression();
+       expression->unary.value = parse_assignment_expression();
        expect(')');
 
        expression->base.datatype = type_void;
@@ -3312,6 +3350,10 @@ static expression_t *parse_primary_expression(void)
        case T___builtin_islessgreater:
        case T___builtin_isunordered:
                return parse_compare_builtin();
+       case T___builtin_constant_p:
+               return parse_builtin_constant();
+       case T___builtin_prefetch:
+               return parse_builtin_prefetch();
        case T___alignof__:
                return parse_alignof();
        case T_assume: