Thanks Jakub. > > +/* Parse a string literal or constant expression yielding a string. > > + The constant expression uses extra parens to avoid ambiguity with "x" > > (expr). > > + > > + asm-string-expr: > > + string-literal > > + ( constant-expr ) */ > > + > > +static tree > > +cp_parser_asm_string_expression (cp_parser *parser) > > +{ > > + location_t sloc = cp_lexer_peek_token (parser->lexer)->location; > > + > > + if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) > > Why should it be wrapped in ()s?
It's true it's only needed for the constraints, but not here. > Too long line. > > > + string = TREE_OPERAND (string, 0); > > + if (TREE_CODE (string) == VIEW_CONVERT_EXPR) > > + string = TREE_OPERAND (string, 0); > > + if (TREE_CODE (string) != STRING_CST && string != error_mark_node) > > + { > > + error_at (sloc, "Expected string valued constant expression for > > %<asm%>, not type %qT", > > + TREE_TYPE (string)); > > Again, too long line, diagnostics should never start with a capital letter, > but more importantly, this will handle only a small subset of what one can > construct with constexpr functions, not everything they can return even if > they return const char * is necessarily a STRING_LITERAL, could be an array > of chars or something similar, especially if the intent is not just to > return prepared whole string literals, but construct the template etc. from > substrings. > > Given the https://wg21.link/P2741R3 C++26 addition, I wonder if it wouldn't That's a good find. > be much better to stay compatible with the static_assert extension there and > use similar thing for inline asm. > See https://gcc.gnu.org/r14-5771 and r14-5956 follow-up for the actual > implementation. Makes sense. I will adapt the code. > One issue is the character set question. The strings in inline asm right > now are untranslated, i.e. remain in SOURCE_CHARSET, usually UTF-8 (in > theory there is also UTF-EBCDIC support, but nobody knows if it actually > works), which is presumably what the assembler expects too. > Most of the string literals and character literals constexpr deals with > are in the execution character set though. For static_assert we just assume > the user knows what he is doing when trying to emit non-ASCII characters in > the message when using say -fexec-charset=EBCDICUS , but should that be the > case for inline asm too? Or should we try to translate those strings back > from execution character set to source character set? Or require that it > actually constructs UTF-8 string literals and for the UTF-EBCDIC case > translate from UTF-8 to UTF-EBCDIC? So the user constexpr functions then > would return u8"insn"; or construct from u8'i' etc. character literals... I think keeping it untranslated is fine for now. Any translation if really needed would be a separate feature. > > In any case, as has been said earlier, this isn't stage4 material. Yes that merge can be deferred of course. -Andi