@@ -2902,26 +2902,16 @@ auto Parser::parse_expression_list(List<ExpressionAST*>*& yyast,
29022902
29032903auto Parser::parse_unary_expression (ExpressionAST*& yyast,
29042904 const ExprContext& ctx) -> bool {
2905- if (parse_unop_expression (yyast, ctx))
2906- return true ;
2907- else if (parse_complex_expression (yyast, ctx))
2908- return true ;
2909- else if (parse_await_expression (yyast, ctx))
2910- return true ;
2911- else if (parse_sizeof_expression (yyast, ctx))
2912- return true ;
2913- else if (parse_alignof_expression (yyast, ctx))
2914- return true ;
2915- else if (parse_noexcept_expression (yyast, ctx))
2916- return true ;
2917- else if (parse_new_expression (yyast, ctx))
2918- return true ;
2919- else if (parse_delete_expression (yyast, ctx))
2920- return true ;
2921- else if (parse_reflect_expression (yyast, ctx))
2922- return true ;
2923- else
2924- return parse_postfix_expression (yyast, ctx);
2905+ if (parse_unop_expression (yyast, ctx)) return true ;
2906+ if (parse_complex_expression (yyast, ctx)) return true ;
2907+ if (parse_await_expression (yyast, ctx)) return true ;
2908+ if (parse_sizeof_expression (yyast, ctx)) return true ;
2909+ if (parse_alignof_expression (yyast, ctx)) return true ;
2910+ if (parse_noexcept_expression (yyast, ctx)) return true ;
2911+ if (parse_new_expression (yyast, ctx)) return true ;
2912+ if (parse_delete_expression (yyast, ctx)) return true ;
2913+ if (parse_reflect_expression (yyast, ctx)) return true ;
2914+ return parse_postfix_expression (yyast, ctx);
29252915}
29262916
29272917auto Parser::parse_unop_expression (ExpressionAST*& yyast,
@@ -3052,6 +3042,52 @@ auto Parser::parse_unop_expression(ExpressionAST*& yyast,
30523042 break ;
30533043 }
30543044
3045+ case TokenKind::T_PLUS_PLUS: {
3046+ if (!is_glvalue (ast->expression )) {
3047+ break ;
3048+ }
3049+
3050+ auto ty = ast->expression ->type ;
3051+
3052+ if (control_->is_arithmetic (ty) && !control_->is_const (ty)) {
3053+ ast->type = ty;
3054+ ast->valueCategory = ValueCategory::kLValue ;
3055+ break ;
3056+ }
3057+
3058+ if (auto ptrTy = type_cast<PointerType>(ty)) {
3059+ if (ptrTy && !control_->is_void (ptrTy->elementType ())) {
3060+ ast->type = ptrTy;
3061+ ast->valueCategory = ValueCategory::kLValue ;
3062+ }
3063+ }
3064+
3065+ break ;
3066+ }
3067+
3068+ case TokenKind::T_MINUS_MINUS: {
3069+ if (!is_glvalue (ast->expression )) {
3070+ break ;
3071+ }
3072+
3073+ auto ty = ast->expression ->type ;
3074+
3075+ if (control_->is_arithmetic (ty) && !control_->is_const (ty)) {
3076+ ast->type = ty;
3077+ ast->valueCategory = ValueCategory::kLValue ;
3078+ break ;
3079+ }
3080+
3081+ if (auto ptrTy = type_cast<PointerType>(ty)) {
3082+ if (ptrTy && !control_->is_void (ptrTy->elementType ())) {
3083+ ast->type = ptrTy;
3084+ ast->valueCategory = ValueCategory::kLValue ;
3085+ }
3086+ }
3087+
3088+ break ;
3089+ }
3090+
30553091 default :
30563092 break ;
30573093 } // switch
0 commit comments