diff -r 3d682f87c870 -r dea39ef02847 stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Mon Feb 24 22:00:55 2014 +0000 +++ b/stage4/generate_c/generate_c_st.cc Sun Mar 02 16:42:56 2014 +0000 @@ -456,6 +456,47 @@ /***********************/ /* B 3.1 - Expressions */ /***********************/ +void *visit(ref_expression_c *symbol) { + s4o.print("((IEC_UDINT)"); + if (this->is_variable_prefix_null()) { + /* For code in FUNCTIONs */ + s4o.print("&("); + symbol->exp->accept(*this); + s4o.print(")"); + } else { + /* For code in FBs, and PROGRAMS... */ + s4o.print("("); + unsigned int vartype = analyse_variable_c::first_nonfb_vardecltype(symbol->exp, scope_); + if (vartype == search_var_instance_decl_c::external_vt) { + if (!get_datatype_info_c::is_type_valid (symbol->exp->datatype)) ERROR; + if ( get_datatype_info_c::is_function_block(symbol->exp->datatype)) + s4o.print(GET_EXTERNAL_FB_REF); + else + s4o.print(GET_EXTERNAL_REF); + } + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(GET_LOCATED_REF); + else + s4o.print(GET_VAR_REF); + + variablegeneration_t old_wanted_variablegeneration = wanted_variablegeneration; + s4o.print("("); + wanted_variablegeneration = complextype_base_vg; + symbol->exp->accept(*this); + s4o.print(","); + wanted_variablegeneration = complextype_suffix_vg; + symbol->exp->accept(*this); + s4o.print(")"); + wanted_variablegeneration = old_wanted_variablegeneration; + + s4o.print(")"); + } + s4o.print(")"); + + return NULL; +} + + void *visit(or_expression_c *symbol) { if (get_datatype_info_c::is_BOOL_compatible(symbol->datatype)) return print_binary_expression(symbol->l_exp, symbol->r_exp, " || ");