@@ -1323,17 +1323,22 @@ void parse_array_compound_literal(var_t *var,
13231323 lex_expect (T_close_curly );
13241324 var -> array_size = count ;
13251325}
1326- bool is_array_literal_temp (var_t * var )
1326+ /* Identify compiler-emitted temporaries that hold array compound literals.
1327+ * Parsing assigns these temporaries synthetic names via gen_name_to (".tN")
1328+ * and they keep array metadata without pointer indirection.
1329+ */
1330+ bool is_compound_literal_array_temp (var_t * var )
13271331{
1328- return var && var -> array_size > 0 && var -> var_name [0 ] == '.' ;
1332+ return var && var -> array_size > 0 && !var -> ptr_level &&
1333+ var -> var_name [0 ] == '.' ;
13291334}
13301335
13311336var_t * scalarize_array_literal (block_t * parent ,
13321337 basic_block_t * * bb ,
13331338 var_t * array_var ,
13341339 type_t * hint_type )
13351340{
1336- if (!is_array_literal_temp (array_var ))
1341+ if (!is_compound_literal_array_temp (array_var ))
13371342 return array_var ;
13381343
13391344 type_t * elem_type = hint_type ? hint_type : array_var -> type ;
@@ -2899,11 +2904,11 @@ void read_expr(block_t *parent, basic_block_t **bb)
28992904 bool rs1_is_ptr_like = rs1 && (rs1 -> ptr_level || rs1 -> array_size );
29002905 bool rs2_is_ptr_like = rs2 && (rs2 -> ptr_level || rs2 -> array_size );
29012906
2902- if (is_array_literal_temp (rs1 ) && !rs2_is_ptr_like )
2907+ if (is_compound_literal_array_temp (rs1 ) && !rs2_is_ptr_like )
29032908 rs1 = scalarize_array_literal (parent , bb , rs1 ,
29042909 rs2 && rs2 -> type ? rs2 -> type : NULL );
29052910
2906- if (is_array_literal_temp (rs2 ) && !rs1_is_ptr_like )
2911+ if (is_compound_literal_array_temp (rs2 ) && !rs1_is_ptr_like )
29072912 rs2 = scalarize_array_literal (parent , bb , rs2 ,
29082913 rs1 && rs1 -> type ? rs1 -> type : NULL );
29092914 /* Constant folding for binary operations */
@@ -3557,8 +3562,8 @@ void read_ternary_operation(block_t *parent, basic_block_t **bb)
35573562 read_expr (parent , & else_ );
35583563 bb_connect (* bb , else_ , ELSE );
35593564 var_t * false_val = opstack_pop ();
3560- bool true_array = is_array_literal_temp (true_val );
3561- bool false_array = is_array_literal_temp (false_val );
3565+ bool true_array = is_compound_literal_array_temp (true_val );
3566+ bool false_array = is_compound_literal_array_temp (false_val );
35623567
35633568 if (true_array && !false_array )
35643569 true_val = scalarize_array_literal (parent , & then_ , true_val ,
@@ -3574,9 +3579,9 @@ void read_ternary_operation(block_t *parent, basic_block_t **bb)
35743579 add_insn (parent , else_ , OP_assign , vd , false_val , NULL , 0 , NULL );
35753580
35763581 var_t * array_ref = NULL ;
3577- if (is_array_literal_temp (true_val ))
3582+ if (is_compound_literal_array_temp (true_val ))
35783583 array_ref = true_val ;
3579- else if (is_array_literal_temp (false_val ))
3584+ else if (is_compound_literal_array_temp (false_val ))
35803585 array_ref = false_val ;
35813586
35823587 if (array_ref ) {
0 commit comments