return str;
}
- char *Value::rearrange_init_code(char *str)
+ char *Value::rearrange_init_code(char *str, Common::Module* usage_mod)
{
switch (valuetype) {
case V_REFD: {
Ttcn::ActualParList *parlist = u.ref.ref->get_parlist();
if (parlist) {
- str = parlist->rearrange_init_code(str,
- u.ref.ref->get_refd_assignment()->get_my_scope()->get_scope_mod_gen());
+ str = parlist->rearrange_init_code(str, usage_mod);
}
break; }
case V_INVOKE: {
- str = u.invoke.v->rearrange_init_code(str);
- str = u.invoke.ap_list->rearrange_init_code(str,
- u.invoke.v->get_expr_governor_last()->get_my_scope()->get_scope_mod_gen());
+ str = u.invoke.v->rearrange_init_code(str, usage_mod);
+ str = u.invoke.ap_list->rearrange_init_code(str, usage_mod);
break; }
case V_EXPR:
switch (u.expr.v_optype) {
case OPTYPE_GET_STRINGENCODING:
case OPTYPE_REMOVE_BOM:
case OPTYPE_DECODE_BASE64:
- str = u.expr.v1->rearrange_init_code(str);
+ str = u.expr.v1->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_DECODE: {
Ttcn::ActualParList *parlist = u.expr.r1->get_parlist();
Common::Assignment *ass = u.expr.r1->get_refd_assignment();
- if (parlist) str = parlist->rearrange_init_code(str, ass->get_my_scope()->get_scope_mod_gen());
+ if (parlist) str = parlist->rearrange_init_code(str, usage_mod);
parlist = u.expr.r2->get_parlist();
ass = u.expr.r2->get_refd_assignment();
- if (parlist) str = parlist->rearrange_init_code(str, ass->get_my_scope()->get_scope_mod_gen());
+ if (parlist) str = parlist->rearrange_init_code(str, usage_mod);
break; }
case OPTYPE_ADD:
case OPTYPE_SUBTRACT:
case OPTYPE_INT2HEX:
case OPTYPE_INT2OCT:
//case OPTYPE_DECODE:
- str = u.expr.v1->rearrange_init_code(str);
- str = u.expr.v2->rearrange_init_code(str);
+ str = u.expr.v1->rearrange_init_code(str, usage_mod);
+ str = u.expr.v2->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_UNICHAR2OCT: // v1 [v2]
case OPTYPE_OCT2UNICHAR:
case OPTYPE_ENCODE_BASE64:
- str = u.expr.v1->rearrange_init_code(str);
- if (u.expr.v2) str = u.expr.v2->rearrange_init_code(str);
+ str = u.expr.v1->rearrange_init_code(str, usage_mod);
+ if (u.expr.v2) str = u.expr.v2->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_SUBSTR:
- str = u.expr.ti1->rearrange_init_code(str, my_scope->get_scope_mod_gen());
- str = u.expr.v2->rearrange_init_code(str);
- str = u.expr.v3->rearrange_init_code(str);
+ str = u.expr.ti1->rearrange_init_code(str, usage_mod);
+ str = u.expr.v2->rearrange_init_code(str, usage_mod);
+ str = u.expr.v3->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_REGEXP:
- str = u.expr.ti1->rearrange_init_code(str, my_scope->get_scope_mod_gen());
- str = u.expr.t2->rearrange_init_code(str, my_scope->get_scope_mod_gen());
- str = u.expr.v3->rearrange_init_code(str);
+ str = u.expr.ti1->rearrange_init_code(str, usage_mod);
+ str = u.expr.t2->rearrange_init_code(str, usage_mod);
+ str = u.expr.v3->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_DECOMP:
- str = u.expr.v1->rearrange_init_code(str);
- str = u.expr.v2->rearrange_init_code(str);
- str = u.expr.v3->rearrange_init_code(str);
+ str = u.expr.v1->rearrange_init_code(str, usage_mod);
+ str = u.expr.v2->rearrange_init_code(str, usage_mod);
+ str = u.expr.v3->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_REPLACE:
- str = u.expr.ti1->rearrange_init_code(str, my_scope->get_scope_mod_gen());
- str = u.expr.v2->rearrange_init_code(str);
- str = u.expr.v3->rearrange_init_code(str);
- str = u.expr.ti4->rearrange_init_code(str, my_scope->get_scope_mod_gen());
+ str = u.expr.ti1->rearrange_init_code(str, usage_mod);
+ str = u.expr.v2->rearrange_init_code(str, usage_mod);
+ str = u.expr.v3->rearrange_init_code(str, usage_mod);
+ str = u.expr.ti4->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_LENGTHOF:
case OPTYPE_SIZEOF:
case OPTYPE_ENCODE:
case OPTYPE_ISPRESENT:
case OPTYPE_TTCN2STRING:
- str = u.expr.ti1->rearrange_init_code(str, my_scope->get_scope_mod_gen());
+ str = u.expr.ti1->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_ISCHOSEN_T:
- str = u.expr.t1->rearrange_init_code(str, my_scope->get_scope_mod_gen());
+ str = u.expr.t1->rearrange_init_code(str, usage_mod);
break;
case OPTYPE_MATCH:
- str = u.expr.v1->rearrange_init_code(str);
- str = u.expr.t2->rearrange_init_code(str, my_scope->get_scope_mod_gen());
+ str = u.expr.v1->rearrange_init_code(str, usage_mod);
+ str = u.expr.t2->rearrange_init_code(str, usage_mod);
break;
default:
// other kinds of expressions cannot appear within templates
* parameter list of parameterized value references
* (e.g. function calls) and in operands of valueof or match
* operations. */
- char *rearrange_init_code(char *str);
+ char *rearrange_init_code(char *str, Common::Module* usage_mod);
/**
* Generates a value for temporary use. Example:
*
{
switch (selection) {
case AP_VALUE:
- str = val->rearrange_init_code(str);
+ str = val->rearrange_init_code(str, usage_mod);
break;
case AP_TEMPLATE:
str = temp->rearrange_init_code(str, usage_mod);
temp->dump(level + 1);
break;
case AP_REF:
- DEBUG(level, "actual parameter: referecne");
+ DEBUG(level, "actual parameter: reference");
ref->dump(level + 1);
break;
case AP_DEFAULT:
return str;
}
- char *ValueRange::rearrange_init_code(char *str)
+ char *ValueRange::rearrange_init_code(char *str, Common::Module* usage_mod)
{
- if (min_v) str = min_v->rearrange_init_code(str);
- if (max_v) str = max_v->rearrange_init_code(str);
+ if (min_v) str = min_v->rearrange_init_code(str, usage_mod);
+ if (max_v) str = max_v->rearrange_init_code(str, usage_mod);
return str;
}
return str;
}
- char *LengthRestriction::rearrange_init_code(char *str)
+ char *LengthRestriction::rearrange_init_code(char *str, Common::Module* usage_mod)
{
if (is_range) {
- str = range.lower->rearrange_init_code(str);
- if (range.upper) str = range.upper->rearrange_init_code(str);
- } else str = single->rearrange_init_code(str);
+ str = range.lower->rearrange_init_code(str, usage_mod);
+ if (range.upper) str = range.upper->rearrange_init_code(str, usage_mod);
+ } else str = single->rearrange_init_code(str, usage_mod);
return str;
}
/** Appends the initialization sequence of all (directly or indirectly)
* referred non-parameterized templates to \a str and returns the resulting
* string. */
- char *rearrange_init_code(char *str);
+ char *rearrange_init_code(char *str, Common::Module* usage_mod);
/** Appends the string representation of the value range to \a str. */
void append_stringRepr(string& str) const;
virtual void dump(unsigned level) const;
/** Appends the initialization sequence of all (directly or indirectly)
* referred non-parameterized templates to \a str and returns the resulting
* string. */
- char *rearrange_init_code(char *str);
+ char *rearrange_init_code(char *str, Common::Module* usage_mod);
/** Appends the string representation of the length restriction to
* \a str. */
void append_stringRepr(string& str) const;
break;
case SPECIFIC_VALUE:
if (get_code_section() == CS_POST_INIT)
- str = u.specific_value->rearrange_init_code(str);
+ str = u.specific_value->rearrange_init_code(str, my_scope->get_scope_mod_gen());
str = u.specific_value->generate_code_init(str, name);
break;
case TEMPLATE_REFD:
break;
case VALUE_RANGE:
if (get_code_section() == CS_POST_INIT)
- str = u.value_range->rearrange_init_code(str);
+ str = u.value_range->rearrange_init_code(str, my_scope->get_scope_mod_gen());
str = u.value_range->generate_code_init(str, name);
break;
case SUPERSET_MATCH:
}
if (length_restriction) {
if (get_code_section() == CS_POST_INIT)
- str = length_restriction->rearrange_init_code(str);
+ str = length_restriction->rearrange_init_code(str, my_scope->get_scope_mod_gen());
str = length_restriction->generate_code_init(str, name);
}
if (is_ifpresent) str = mputprintf(str, "%s.set_ifpresent();\n", name);
{
switch (templatetype) {
case SPECIFIC_VALUE:
- str = u.specific_value->rearrange_init_code(str);
+ str = u.specific_value->rearrange_init_code(str, usage_mod);
break;
case TEMPLATE_REFD:
str = rearrange_init_code_refd(str, usage_mod);
->rearrange_init_code(str, usage_mod);
break;
case VALUE_RANGE:
- str = u.value_range->rearrange_init_code(str);
+ str = u.value_range->rearrange_init_code(str, usage_mod);
break;
default:
break;
}
- if (length_restriction) str = length_restriction->rearrange_init_code(str);
+ if (length_restriction) str = length_restriction->rearrange_init_code(str, usage_mod);
return str;
}
char *Template::rearrange_init_code_invoke(char *str, Common::Module* usage_mod)
{
- str = u.invoke.v->rearrange_init_code(str);
+ str = u.invoke.v->rearrange_init_code(str, usage_mod);
str = u.invoke.ap_list->rearrange_init_code(str, usage_mod);
return str;
}
centralstorage mfgen-tpd \
openType optionalAssignCompare portConstructor \
isbound namedActualParameters assignmentNotation \
- attribQualif HT48786 selectCase openTypeNames
+ attribQualif HT48786 selectCase openTypeNames \
+ defaultParamUsageBeforeDecl
all dep clean distclean:
for dir in $(CODIRS); do $(MAKE) -C $$dir $@ || exit; done
--- /dev/null
+/******************************************************************************
+ * Copyright (c) 2000-2016 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Baranyi, Botond
+ *
+ ******************************************************************************/
+
+// Test for bug fix artf724695 : Incorrect code generated for template default value
+// This module uses the template and function default values declared in module B.
+// Code for this module is generated before code for module B.
+module A
+{
+
+import from B all;
+
+type record double_wrapped_string
+{
+ wrapped_string w_string
+}
+
+template double_wrapped_string t_double_wrapped_string
+(
+ template wrapped_string pl_wrapped_string := t_wrapped_string()
+):=
+{
+ w_string := pl_wrapped_string
+}
+
+}
+
--- /dev/null
+/******************************************************************************
+ * Copyright (c) 2000-2016 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Baranyi, Botond
+ *
+ ******************************************************************************/
+
+// Test for bug fix artf724695 : Incorrect code generated for template default value
+// The default values of templates and functions declared in this module are used in module A.
+// Code for this module is generated after code for module A.
+module B
+{
+
+function f
+(
+ template charstring pl_stringA := omit,
+ template charstring pl_stringB := omit // code for this default value was previously generated in A.cc
+)
+return charstring
+{
+ var charstring vl_return := "";
+ if(isvalue(pl_stringA))
+ {
+ vl_return := vl_return & valueof(pl_stringA)
+ }
+ if(isvalue(pl_stringB))
+ {
+ vl_return := vl_return & valueof(pl_stringB)
+ }
+ return vl_return
+}
+
+type record wrapped_string
+{
+ charstring string
+}
+
+template wrapped_string t_wrapped_string
+(
+ template charstring pl_string := f(pl_stringA := "EMMA")
+):=
+{
+ string := pl_string
+}
+
+
+}
+
--- /dev/null
+##############################################################################
+# Copyright (c) 2000-2016 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Balasko, Jeno
+# Delic, Adam
+# Kovacs, Ferenc
+# Raduly, Csaba
+# Szabados, Kristof
+# Szabo, Janos Zoltan – initial implementation
+#
+##############################################################################
+TOPDIR := ../..
+include $(TOPDIR)/Makefile.regression
+
+.PHONY: all clean dep
+
+TTCN3_LIB := ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX)
+
+MODULES := A.ttcn B.ttcn
+
+GENERATED_SOURCES := $(MODULES:.ttcn=.cc)
+GENERATED_HEADERS := $(GENERATED_SOURCES:.cc=.hh)
+ifdef CODE_SPLIT
+GENERATED_SOURCES := $(foreach file, $(GENERATED_SOURCES:.cc=), $(addprefix $(file), .cc _seq.cc _set.cc _seqof.cc _setof.cc _union.cc))
+endif
+
+OBJECTS := $(GENERATED_SOURCES:.cc=.o)
+
+TARGET := defaultParamUsageBeforeDecl$(EXESUFFIX)
+
+all: $(TARGET) ;
+
+$(TARGET): $(GENERATED_SOURCES) $(USER_SOURCES)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \
+ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS)
+
+$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile
+ @if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi
+
+compile: $(MODULES)
+ $(TTCN3_COMPILER) $(COMPILER_FLAGS) $^ - $?
+ touch $@
+
+clean distclean:
+ -$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \
+ $(GENERATED_SOURCES) compile *.log Makefile.bak
+
+dep: $(GENERATED_SOURCES)
+ makedepend $(CPPFLAGS) $(USER_SOURCES) $(GENERATED_SOURCES)