F diff --git a/src/frontend/parse/parse_declaration.c b/src/frontend/parse/parse_declaration.c --- a/src/frontend/parse/parse_declaration.c +++ b/src/frontend/parse/parse_declaration.cif(hold->denotation==DT_Function){+ Scope_Push(scope,hold,translation_data);/*check if this is a function definition*/if(parse_function_definitions && get_and_check(translation_data,KW_OPEN_CURLY)){((struct Denoted_Function*)hold) ->body=(struct AST_Compound_Statement*)parse_finish_compound_statement(translation_data,(struct Scope*)function_type->function_prototype_scope);Queue_Push(where_to_push,get_function_definition_tree(scope,(struct Denoted_Function*)hold));- Scope_Push(scope,hold,translation_data);break;}/*this is a function declaration*/F diff --git a/src/frontend/parse/parse_expression.c b/src/frontend/parse/parse_expression.c --- a/src/frontend/parse/parse_expression.c +++ b/src/frontend/parse/parse_expression.chold_postfix_expression=parse_primary_expression(translation_data,scope);- while(translation_data->tokens->size!=0)+ while(translation_data->tokens->size!=0 && hold_postfix_expression!=NULL){switch(kw_get(translation_data)){F diff --git a/src/semantics/ast.c b/src/semantics/ast.c --- a/src/semantics/ast.c +++ b/src/semantics/ast.c);}+ struct AST_Expression* get_degraded_array_expression_if_it_has_the_right_type(struct AST_Expression *expression,struct Translation_Data *translation_data)+ {+ struct Type *expression_type;+ struct Type_Array *array_type;++ expression_type=extract_expresion_value_type(expression->value,translation_data);+ if(expression_type->specifier==TS_ARRAY)+ {+ array_type=(struct Type_Array*)expression_type;+ expression_type=get_pointer_type(array_type->is_array_of,1,0);++ assert(expression_type!=NULL);++ return get_cast_expression_tree(expression,expression_type,translation_data);+ }else+ {+ return expression;+ }+ }/** it finds the common real type of the operands then 'upgrades' themstruct Type_Basic *right_type;struct Expression_Value *value;+ left=get_degraded_array_expression_if_it_has_the_right_type(left,translation_data);+ right=get_degraded_array_expression_if_it_has_the_right_type(right,translation_data);+left=get_promoted_expression(left,translation_data);right=get_promoted_expression(right,translation_data);struct Type *left_type;struct Type *member_type;+ left=get_degraded_array_expression_if_it_has_the_right_type(left,translation_data);+ right=get_degraded_array_expression_if_it_has_the_right_type(right,translation_data);+left_type=extract_expresion_value_type(left->value,translation_data);if(left_type->specifier!=TS_POINTER){push_translation_error("expected pointer in array subscript",translation_data);return NULL;}struct AST_Unary_Expression* get_postfix_inc_dec_tree(struct AST_Expression *operand,enum AST_Type operation,struct Translation_Data *translation_data){struct Type *operand_type;+ operand=get_degraded_array_expression_if_it_has_the_right_type(operand,translation_data);operand_type=extract_expresion_value_type(operand->value,translation_data);if(constraint_check_postfix_inc_dec_expression(operand,operation,translation_data)){struct AST_Unary_Expression* get_prefix_inc_dec_tree(struct AST_Expression *operand,enum AST_Type operation,struct Translation_Data *translation_data){struct Type *operand_type;+ operand=get_degraded_array_expression_if_it_has_the_right_type(operand,translation_data);operand_type=extract_expresion_value_type(operand->value,translation_data);if(constraint_check_prefix_inc_dec_expression(operand,operation,translation_data)){F diff --git a/src/semantics/ast.h b/src/semantics/ast.h --- a/src/semantics/ast.h +++ b/src/semantics/ast.hstruct AST_Expression* get_cast_expression_tree(struct AST_Expression *operand,struct Type *type,struct Translation_Data *translation_data);+ struct AST_Expression* get_degraded_array_expression_if_it_has_the_right_type(struct AST_Expression *expression,struct Translation_Data *translation_data);struct AST_Binary_Expression* get_binary_expression_after_conversion(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type type,struct Translation_Data *translation_data);struct AST_Binary_Expression* get_binary_expression_tree(struct AST_Expression *left,struct AST_Expression *right,struct Expression_Value *value,enum AST_Type type);struct AST_Binary_Expression* get_modulo_tree(struct AST_Expression *left,struct AST_Expression *right,struct Translation_Data *translation_data);