Skip to content

Commit 5381f5a

Browse files
committed
C: Support expr as assert message
1 parent 2bc383f commit 5381f5a

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

src/libasr/codegen/asr_to_c.cpp

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,19 +1066,50 @@ R"( // Initialise Numpy
10661066
std::string out = indent;
10671067
bracket_open++;
10681068
visit_expr(*x.m_test);
1069+
std::string test_condition = src;
10691070
if (ASR::is_a<ASR::SymbolicCompare_t>(*x.m_test)){
10701071
out = symengine_src;
10711072
symengine_src = "";
10721073
out += indent;
10731074
}
10741075
if (x.m_msg) {
1076+
this->visit_expr(*x.m_msg);
1077+
std::string tmp_gen = "";
1078+
ASR::ttype_t* value_type = ASRUtils::expr_type(x.m_msg);
1079+
if( ASR::is_a<ASR::List_t>(*value_type) ||
1080+
ASR::is_a<ASR::Tuple_t>(*value_type)) {
1081+
std::string p_func = c_ds_api->get_print_func(value_type);
1082+
tmp_gen += indent + p_func + "(" + src + ");\n";
1083+
} else {
1084+
tmp_gen += "\"";
1085+
tmp_gen += c_ds_api->get_print_type(value_type, ASR::is_a<ASR::ArrayItem_t>(*x.m_msg));
1086+
tmp_gen += "\", ";
1087+
if( ASRUtils::is_array(value_type) ) {
1088+
src += "->data";
1089+
}
1090+
if(ASR::is_a<ASR::SymbolicExpression_t>(*value_type)) {
1091+
src += symengine_src;
1092+
symengine_src = "";
1093+
}
1094+
if (ASR::is_a<ASR::Complex_t>(*value_type)) {
1095+
tmp_gen += "creal(" + src + ")";
1096+
tmp_gen += ", ";
1097+
tmp_gen += "cimag(" + src + ")";
1098+
} else if(ASR::is_a<ASR::SymbolicExpression_t>(*value_type)){
1099+
tmp_gen += "basic_str(" + src + ")";
1100+
if(ASR::is_a<ASR::Var_t>(*x.m_msg)) {
1101+
symengine_queue.pop();
1102+
}
1103+
} else {
1104+
tmp_gen += src;
1105+
}
1106+
}
10751107
out += "ASSERT_MSG(";
1076-
out += src + ", ";
1077-
visit_expr(*x.m_msg);
1078-
out += src + ");\n";
1108+
out += test_condition + ", ";
1109+
out += tmp_gen + ");\n";
10791110
} else {
10801111
out += "ASSERT(";
1081-
out += src + ");\n";
1112+
out += test_condition + ");\n";
10821113
}
10831114
bracket_open--;
10841115
src = check_tmp_buffer() + out;

src/libasr/runtime/lfortran_intrinsics.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,16 @@ typedef double _Complex double_complex_t;
5050
#endif
5151

5252
#ifndef ASSERT_MSG
53-
#define ASSERT_MSG(cond, msg) \
53+
#define ASSERT_MSG(cond, fmt, msg) \
5454
{ \
5555
if (!(cond)) { \
5656
printf("%s%s", "ASSERT failed: ", __FILE__); \
5757
printf("%s%s", "\nfunction ", __func__); \
5858
printf("%s%d%s", "(), line number ", __LINE__, " at \n"); \
5959
printf("%s%s", #cond, "\n"); \
60-
printf("%s", "ERROR MESSAGE:\n"); \
61-
printf("%s%s", msg, "\n"); \
60+
printf("%s", "ERROR MESSAGE: "); \
61+
printf(fmt, msg); \
62+
printf("%s", "\n"); \
6263
exit(1); \
6364
} \
6465
}

0 commit comments

Comments
 (0)