diff --git a/src/expand/assert.cpp b/src/expand/assert.cpp index 4fd67b43..de7dd472 100644 --- a/src/expand/assert.cpp +++ b/src/expand/assert.cpp @@ -83,7 +83,6 @@ class CExpander_assert: else if( tok == TOK_EOF ) { ::std::stringstream ss; - ss << "assertion failed: "; n->print(ss); toks.push_back( Token(InterpolatedFragment(InterpolatedFragment::EXPR, n.release())) ); @@ -93,6 +92,8 @@ class CExpander_assert: toks.push_back( Token(TOK_IDENT, RcString::new_interned("panic")) ); toks.push_back( Token(TOK_EXCLAM) ); toks.push_back( Token(TOK_PAREN_OPEN) ); + toks.push_back( Token(TOK_STRING, std::string("assertion failed: {}")) ); + toks.push_back( Token(TOK_COMMA) ); toks.push_back( Token(TOK_STRING, ss.str()) ); toks.push_back( Token(TOK_PAREN_CLOSE) ); } diff --git a/src/expand/format_args.cpp b/src/expand/format_args.cpp index 7f45f6f0..e9377d81 100644 --- a/src/expand/format_args.cpp +++ b/src/expand/format_args.cpp @@ -856,6 +856,19 @@ class CFormatArgsExpander: return expand_format_args(sp, crate, lex, /*add_newline=*/false); } }; +class CConstFormatArgsExpander: + public ExpandProcMacro +{ + ::std::unique_ptr expand(const Span& sp, const ::AST::Crate& crate, const TokenTree& tt, AST::Module& mod) override + { + Token tok; + + auto lex = TTStream(sp, ParseState(), tt); + lex.parse_state().module = &mod; + + return expand_format_args(sp, crate, lex, /*add_newline=*/false); + } +}; class CFormatArgsNlExpander: public ExpandProcMacro @@ -872,5 +885,6 @@ class CFormatArgsNlExpander: }; STATIC_MACRO("format_args", CFormatArgsExpander); +STATIC_MACRO("const_format_args", CConstFormatArgsExpander); STATIC_MACRO("format_args_nl", CFormatArgsNlExpander); diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index c0212dae..726c2b30 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -281,6 +281,7 @@ ::std::unique_ptr Expand_Macro_Inner( return ProcMacro_Invoke(mi_span, crate, mac_path, input_tt); } TU_ARMA(BuiltinProcMacro, proc_mac) { + ASSERT_BUG(mi_span, proc_mac, "null BuiltinProcMacro? " << path); auto e = input_ident == "" ? proc_mac->expand(mi_span, crate, input_tt, mod) : proc_mac->expand_ident(mi_span, crate, input_ident, input_tt, mod)