summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/expand/concat.cpp3
-rw-r--r--src/expand/format_args.cpp10
-rw-r--r--src/expand/mod.cpp8
-rw-r--r--src/include/synext.hpp2
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