diff options
-rw-r--r-- | src/expand/concat.cpp | 3 | ||||
-rw-r--r-- | src/expand/format_args.cpp | 10 | ||||
-rw-r--r-- | src/expand/mod.cpp | 8 | ||||
-rw-r--r-- | src/include/synext.hpp | 2 |
4 files changed, 18 insertions, 5 deletions
diff --git a/src/expand/concat.cpp b/src/expand/concat.cpp index 61840065..46498d4f 100644 --- a/src/expand/concat.cpp +++ b/src/expand/concat.cpp @@ -24,8 +24,7 @@ class CConcatExpander: do { auto v = Parse_Expr0(lex); DEBUG("concat - v=" << *v); - Expand_Expr(true , *const_cast<AST::Crate*>(&crate), LList<const AST::Module*>(nullptr, &mod), v); - Expand_Expr(false, *const_cast<AST::Crate*>(&crate), LList<const AST::Module*>(nullptr, &mod), v); + Expand_BareExpr(crate, mod, v); DEBUG("concat[pe] - v=" << *v); if( auto* vp = dynamic_cast<AST::ExprNode_String*>(v.get()) ) { diff --git a/src/expand/format_args.cpp b/src/expand/format_args.cpp index b25cc595..6460da1b 100644 --- a/src/expand/format_args.cpp +++ b/src/expand/format_args.cpp @@ -1,6 +1,7 @@ /* */ #include <synext_macro.hpp> +#include <synext.hpp> // for Expand_BareExpr #include "../parse/common.hpp" #include "../parse/parseerror.hpp" #include "../parse/tokentree.hpp" @@ -265,7 +266,14 @@ class CFormatArgsExpander: ERROR(sp, E0000, "format_args! doesn't take an ident"); auto n = Parse_ExprVal(lex); - auto format_string = dynamic_cast<AST::ExprNode_String&>(*n).m_value; + ASSERT_BUG(sp, n, "No expression returned"); + Expand_BareExpr(crate, mod, n); + + auto* format_string_np = dynamic_cast<AST::ExprNode_String*>(&*n); + if( !format_string_np ) { + ERROR(sp, E0000, "format_args! requires a string literal - got " << *n); + } + const auto& format_string = format_string_np->m_value; ::std::map< ::std::string, unsigned int> named_args_index; ::std::vector<TokenTree> named_args; diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 55fd7d63..2b317916 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -248,7 +248,7 @@ struct CExpandExpr: } ::AST::Module& cur_mod() { - return *(::AST::Module*)(modstack.m_item); + return *const_cast< ::AST::Module*>(modstack.m_item); } void visit(::std::unique_ptr<AST::ExprNode>& cnode) { @@ -584,6 +584,12 @@ void Expand_Expr(bool is_early, ::AST::Crate& crate, LList<const AST::Module*> m } } +void Expand_BareExpr(const ::AST::Crate& crate, const AST::Module& mod, ::std::unique_ptr<AST::ExprNode>& node) +{ + Expand_Expr(true , const_cast< ::AST::Crate&>(crate), LList<const AST::Module*>(nullptr, &mod), node); + Expand_Expr(false, const_cast< ::AST::Crate&>(crate), LList<const AST::Module*>(nullptr, &mod), node); +} + void Expand_Impl(bool is_early, ::AST::Crate& crate, LList<const AST::Module*> modstack, ::AST::Path modpath, ::AST::Module& mod, ::AST::Impl& impl) { Expand_Attrs(impl.def().attrs(), stage_pre(is_early), crate, mod, impl.def()); diff --git a/src/include/synext.hpp b/src/include/synext.hpp index 76b41996..67f3b87b 100644 --- a/src/include/synext.hpp +++ b/src/include/synext.hpp @@ -8,7 +8,7 @@ #include "synext_decorator.hpp" #include "synext_macro.hpp" -extern void Expand_Expr(bool is_early, ::AST::Crate& crate, LList<const AST::Module*> modstack, ::std::unique_ptr<AST::ExprNode>& node); +extern void Expand_BareExpr(const ::AST::Crate& crate, const AST::Module& mod, ::std::unique_ptr<AST::ExprNode>& node); #endif |