@@ -1370,17 +1370,22 @@ void parse_array_compound_literal(var_t *var,
13701370 lex_expect (T_close_curly );
13711371 var -> array_size = count ;
13721372}
1373- bool is_array_literal_temp (var_t * var )
1373+ /* Identify compiler-emitted temporaries that hold array compound literals.
1374+ * Parsing assigns these temporaries synthetic names via gen_name_to (".tN")
1375+ * and they keep array metadata without pointer indirection.
1376+ */
1377+ bool is_compound_literal_array_temp (var_t * var )
13741378{
1375- return var && var -> array_size > 0 && var -> var_name [0 ] == '.' ;
1379+ return var && var -> array_size > 0 && !var -> ptr_level &&
1380+ var -> var_name [0 ] == '.' ;
13761381}
13771382
13781383var_t * scalarize_array_literal (block_t * parent ,
13791384 basic_block_t * * bb ,
13801385 var_t * array_var ,
13811386 type_t * hint_type )
13821387{
1383- if (!is_array_literal_temp (array_var ))
1388+ if (!is_compound_literal_array_temp (array_var ))
13841389 return array_var ;
13851390
13861391 type_t * elem_type = hint_type ? hint_type : array_var -> type ;
@@ -2946,11 +2951,11 @@ void read_expr(block_t *parent, basic_block_t **bb)
29462951 bool rs1_is_ptr_like = rs1 && (rs1 -> ptr_level || rs1 -> array_size );
29472952 bool rs2_is_ptr_like = rs2 && (rs2 -> ptr_level || rs2 -> array_size );
29482953
2949- if (is_array_literal_temp (rs1 ) && !rs2_is_ptr_like )
2954+ if (is_compound_literal_array_temp (rs1 ) && !rs2_is_ptr_like )
29502955 rs1 = scalarize_array_literal (parent , bb , rs1 ,
29512956 rs2 && rs2 -> type ? rs2 -> type : NULL );
29522957
2953- if (is_array_literal_temp (rs2 ) && !rs1_is_ptr_like )
2958+ if (is_compound_literal_array_temp (rs2 ) && !rs1_is_ptr_like )
29542959 rs2 = scalarize_array_literal (parent , bb , rs2 ,
29552960 rs1 && rs1 -> type ? rs1 -> type : NULL );
29562961 /* Constant folding for binary operations */
@@ -3604,8 +3609,8 @@ void read_ternary_operation(block_t *parent, basic_block_t **bb)
36043609 read_expr (parent , & else_ );
36053610 bb_connect (* bb , else_ , ELSE );
36063611 var_t * false_val = opstack_pop ();
3607- bool true_array = is_array_literal_temp (true_val );
3608- bool false_array = is_array_literal_temp (false_val );
3612+ bool true_array = is_compound_literal_array_temp (true_val );
3613+ bool false_array = is_compound_literal_array_temp (false_val );
36093614
36103615 if (true_array && !false_array )
36113616 true_val = scalarize_array_literal (parent , & then_ , true_val ,
@@ -3621,9 +3626,9 @@ void read_ternary_operation(block_t *parent, basic_block_t **bb)
36213626 add_insn (parent , else_ , OP_assign , vd , false_val , NULL , 0 , NULL );
36223627
36233628 var_t * array_ref = NULL ;
3624- if (is_array_literal_temp (true_val ))
3629+ if (is_compound_literal_array_temp (true_val ))
36253630 array_ref = true_val ;
3626- else if (is_array_literal_temp (false_val ))
3631+ else if (is_compound_literal_array_temp (false_val ))
36273632 array_ref = false_val ;
36283633
36293634 if (array_ref ) {
0 commit comments