On Tue, Jan 07, 2025 at 08:36:29PM +0100, Jakub Jelinek wrote:
> Hi!
>
> The following patch fixes ICEs when the new inline asm syntax
> to use C++26 static_assert-like constant expressions in place
> of string literals is used in templates.
> As finish_asm_stmt doesn't do any checking for
> processing_template_decl, this patch also just defers handling
> those strings in templates rather than say trying fold_non_dependent_expr
> and if the result is non-dependent and usable, try to extract.
Thanks. I've been looking at a similar patch, but you beat me to it.
Your patch looks good to me, except for two comments below.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> There is one case I didn't handle and I'd like to discuss.
> The initial commit to enable this new extension also changed
> cp_parser_asm_specification_opt to use cp_parser_asm_string_expression.
> That function doesn't have anything to do with asm statements though,
> it is about asm redirection of declarations.
I don't know of a use case for this, so i guess it can be rejected
(like this patchlet)
@@ -30067,7 +30063,11 @@ cp_parser_asm_specification_opt (cp_parser* parser)
parens.require_open (parser);
/* Look for the string-literal. */
+ token = cp_lexer_peek_token (parser->lexer);
tree asm_specification = cp_parser_asm_string_expression (parser);
+ if (TREE_CODE (asm_specification) != STRING_CST)
+ error_at (token->location,
+ "%<asm%> specification for declaration must be string");
/* Look for the `)'. */
parens.require_close (parser);
Since you add a return of error_mark_node to finish_asm_stmt you
also need this patchlet:
@@ -19170,7 +19170,8 @@ tsubst_stmt (tree t, tree args, tsubst_flags_t
complain, tree in_decl)
tree asm_expr = tmp;
if (TREE_CODE (asm_expr) == CLEANUP_POINT_EXPR)
asm_expr = TREE_OPERAND (asm_expr, 0);
- ASM_BASIC_P (asm_expr) = ASM_BASIC_P (t);
+ if (asm_expr != error_mark_node)
+ ASM_BASIC_P (asm_expr) = ASM_BASIC_P (t);
}
break;
> else if (!cp_parser_is_string_literal (tok))
> {
> --- gcc/testsuite/g++.dg/cpp1z/constexpr-asm-4.C.jj 2025-01-07
> 12:19:34.472033295 +0100
> +++ gcc/testsuite/g++.dg/cpp1z/constexpr-asm-4.C 2025-01-07
> 12:28:59.178178486 +0100
It needs a test case with constexpr errors too. In my version I had
a lot of trouble with them.
-Andi