FX, You're likely correct that the creation of an expression for c_null_char is overkill. I copied the code from gfc_conv_concat_op() in trans-expr.cc to get the 'f_c_string(s) -> trim(s) // c_null_char'. This was the motivation of creating a string. If I look at the -fdump-tree-orginal for
s1 = 'abc ' s2 = f_c_string(s1) I see (slightly edited to reduce noise) _string_trim (&tlen.0, (void **) &tstr.1, 6, &s1); D.4785 = (void *) __builtin_malloc (MAX_EXPR <(tlen.0 + 1), 1>); pstr.2 = (character(kind=1) *) D.4785; _concat_string (tlen.0+1, pstr.2, tlen.0, tstr.1, 1, &"z"[1]{lb: 1 sz: 1}); so the c_null_char (currently 'z') simply appears as a constant. I keep your comment in mind when I polish the code. -- steve On Tue, Dec 10, 2024 at 11:15:10PM +0100, FX Coudert wrote: > Hi Steve, > > I think it’d be simpler not to create a front-end expression for the > c_null_char. Unless I’m mistaken, you only need it as an argument to pass to > build_call_expr_loc (input_location, gfor_fndecl_concat_string, …). You can > pass a pointer to the constant character, and the length is one. The variable > for length would be build_int_cst (gfc_charlen_type_node, 1). For the pointer > to the constant character, you would do: > > tree nulchar = gfc_character1_type_node(gfc_character1_type_node, > “nulchar”); > gfc_add_modify (&block, nulchar, build_zero_cst (gfc_character1_type_node)); > tree pnulchar = gfc_build_addr_expr (NULL_TREE, nulchar); > > Since the variable in this case is a known constant, there’s probably even a > better way. I just don’t remember enough, but others may help? > > --- > > Regarding your question, you are right: you want to build the two code blocks > (you already have the content), then use: fold_build3_loc (input_location, > COND_EXPR, return_type, boolexpression, iftrue, iffalse) > > You will find some logic like that in gfc_conv_intrinsic_minmaxloc() near the > comment "We switch to > or >= depending on the value of the BACK argument”. > You create ifblock and elseblock, once you have the code inside them, you > make them into trees with gfc_finish_block (becoming ifbody2 and elsebody2). > Then: > > tmp = fold_build3_loc (input_location, COND_EXPR, logical_type_node, > back, ifbody2, elsebody2); > > > Hope this helps? > > > Best, > FX -- Steve