diff --git a/compiler2/Type_codegen.cc b/compiler2/Type_codegen.cc index 04e5c6c3a373ed77040571870c6586cde961fd0d..8d2aa7a5e4d2b11a41301dbd8e68e88222b652db 100644 --- a/compiler2/Type_codegen.cc +++ b/compiler2/Type_codegen.cc @@ -2591,19 +2591,32 @@ void Type::generate_code_ispresentbound(expression_struct *expr, closing_brackets = closing_brackets2; const string& tmp_id = module->get_temporary_id(); + const string& tmp_id2 = module->get_temporary_id(); const char *tmp_id_str = tmp_id.c_str(); + const char *tmp_id2_str = tmp_id2.c_str(); + + // Own const ref to the temp value + expr->expr = mputprintf(expr->expr, + "const %s%s& %s = %s;\n", + t->get_genname_value(module).c_str(), + is_template ? "_template" : "", + tmp_id_str, tmp_generalid_str); + // Get the const ref of the field from the previous const ref + // If we would get the const ref of the field immediately then the + // value in the const ref would be free-d instantly. expr->expr = mputprintf(expr->expr, "const %s%s& %s = %s.%s%s();\n", next_t->get_genname_value(module).c_str(), - is_template?"_template":"", tmp_id_str, tmp_generalid_str, + is_template ? "_template" : "", + tmp_id2_str, tmp_id_str, t->typetype == T_ANYTYPE ? "AT_" : "", id.get_name().c_str()); expr->expr = mputprintf(expr->expr, "%s = %s.%s(%s);\n", global_id.c_str(), - tmp_id_str, isbound||(i!=(nof_refs-1)) ? "is_bound" : "is_present", + tmp_id2_str, isbound||(i!=(nof_refs-1)) ? "is_bound" : "is_present", (!(isbound||(i!=(nof_refs-1))) && is_template && omit_in_value_list) ? "TRUE" : ""); Free(tmp_generalid_str); - tmp_generalid_str = mcopystr(tmp_id_str); + tmp_generalid_str = mcopystr(tmp_id2_str); } t = next_t; diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc index 1a81106363a1293e82b549f277fb0501ba9d1ba5..b891ef2266be69327e60b6c20026ee99fe2f8f72 100644 --- a/compiler2/ttcn3/AST_ttcn3.cc +++ b/compiler2/ttcn3/AST_ttcn3.cc @@ -784,19 +784,33 @@ namespace Ttcn { Common::Assignment *ass = get_refd_assignment(); const string& ass_id = ass->get_genname_from_scope(my_scope); const char *ass_id_str = ass_id.c_str(); - + + expression_struct_t t; + Code::init_expr(&t); + // Generate the default parameters if needed + if (parlist) { + parlist->generate_code_alias(&t, ass->get_FormalParList(), + ass->get_RunsOnType(), false); + } + string ass_id2 = ass_id; + if (t.expr != NULL) { + ass_id2 = ass_id2 + "(" + t.expr + ")"; + ass_id_str = ass_id2.c_str(); + } + Code::free_expr(&t); + if (subrefs.get_nof_refs() > 0) { const string& tmp_generalid = my_scope->get_scope_mod_gen() ->get_temporary_id(); const char *tmp_generalid_str = tmp_generalid.c_str(); - + expression_struct isbound_expr; Code::init_expr(&isbound_expr); isbound_expr.preamble = mputprintf(isbound_expr.preamble, "boolean %s = %s.is_bound();\n", tmp_generalid_str, ass_id_str); ass->get_Type()->generate_code_ispresentbound(&isbound_expr, &subrefs, my_scope->get_scope_mod_gen(), - tmp_generalid, ass_id, is_template, isbound); + tmp_generalid, ass_id2, is_template, isbound); expr->preamble = mputstr(expr->preamble, isbound_expr.preamble); expr->preamble = mputstr(expr->preamble, isbound_expr.expr); diff --git a/regression_test/recordOper/TrecordOper.ttcn b/regression_test/recordOper/TrecordOper.ttcn index 3d5c025faae8d88e992c6409b763aa7d57425228..f67b5102106a7f2d891a6aba03096fa233354937 100644 --- a/regression_test/recordOper/TrecordOper.ttcn +++ b/regression_test/recordOper/TrecordOper.ttcn @@ -1542,6 +1542,779 @@ testcase tc_record_partiallyInit13() runs on recordOper_mycomp { if(ispresent(vl_r.roi[0])){setverdict(fail)}else {setverdict(pass)}; if(ispresent(vl_r.roi[90])){setverdict(fail)}else {setverdict(pass)}; } + + + + + + //##########################################################################// + + type record ExampleType { + integer a, + boolean b + } + + template ExampleType exampleTemplate1 := { + a := 4, + b := false + } + + testcase tc_rec_template() runs on recordOper_mycomp { + + if (isbound(exampleTemplate1)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate1)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate1.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate1.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + +//###########################################################################// + + template ExampleType exampleTemplate2(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) := { + a := MyintTemplate, + b := MyBoolTemplate + } + + testcase tc_rec_template_param() runs on recordOper_mycomp { + + if (isbound(exampleTemplate2)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate2)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate2.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate2.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate2(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate2(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate2(true).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate2(true).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate2(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate2(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate2(true, 3).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate2(true, 3).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + +//###########################################################################// + + template ExampleType exampleTemplate3(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) modifies exampleTemplate2 := { + a := MyintTemplate, + b := MyBoolTemplate + } + + testcase tc_rec_template_param_modifies() runs on recordOper_mycomp { + + if (isbound(exampleTemplate3)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate3)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate3.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate3.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate3(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate3(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate3(true).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate3(true).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate3(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate3(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleTemplate3(true, 3).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleTemplate3(true, 3).a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + +//###########################################################################// + + type record ExampleType2 { + integer a, + ExampleType t + } + + + template ExampleType2 exampleEmbTemplate1 := { + a := 4, + t := {3, true} + } + + testcase tc_emb_rec_template() runs on recordOper_mycomp { + + if (isbound(exampleEmbTemplate1)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate1)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate1.t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate1.t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate1.t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate1.t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + +//###########################################################################// + + template ExampleType2 exampleEmbTemplate2(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) := { + a := MyintTemplate, + t := {MyintTemplate, MyBoolTemplate} + } + + testcase tc_emb_rec_template_param() runs on recordOper_mycomp { + + if (isbound(exampleEmbTemplate2)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2.t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2.t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2.t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2.t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2(true).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2(true).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2(true).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2(true).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2(true, 3).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2(true, 3).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate2(true, 3).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate2(true, 3).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + +//###########################################################################// + + template ExampleType2 exampleEmbTemplate3(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) modifies exampleEmbTemplate2 := { + a := MyintTemplate, + t := {MyintTemplate, MyBoolTemplate} + } + + testcase tc_emb_rec_template_param_modifies() runs on recordOper_mycomp { + + if (isbound(exampleEmbTemplate3)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3.t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3.t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3.t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3.t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3(true).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3(true).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3(true).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3(true).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3(true, 3).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3(true, 3).t)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleEmbTemplate3(true, 3).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleEmbTemplate3(true, 3).t.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + +//###########################################################################// + +template anytype exampleAnyTypeTemplate1 := { + ExampleType := {2, false} +} + +testcase tc_anytype_rec_template() runs on recordOper_mycomp { + + if (isbound(exampleAnyTypeTemplate1)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate1)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate1.ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate1.ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate1.ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate1.ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + + template anytype exampleAnyTypeTemplate2(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) := { + ExampleType := {MyintTemplate, MyBoolTemplate} + } + + testcase tc_anytype_rec_template_param() runs on recordOper_mycomp { + + if (isbound(exampleAnyTypeTemplate2)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2.ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2.ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2.ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2.ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2(true).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2(true).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2(true).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2(true).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2(true, 3).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2(true, 3).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate2(true, 3).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate2(true, 3).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + + template anytype exampleAnyTypeTemplate3(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) modifies exampleAnyTypeTemplate2 := { + ExampleType := {MyintTemplate, MyBoolTemplate} + } + + testcase tc_anytype_rec_template_param_modifies() runs on recordOper_mycomp { + + if (isbound(exampleAnyTypeTemplate3)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3.ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3.ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3.ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3.ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3(true))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3(true).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3(true).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3(true).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3(true).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3(true, 3))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3(true, 3).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3(true, 3).ExampleType)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(exampleAnyTypeTemplate3(true, 3).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(exampleAnyTypeTemplate3(true, 3).ExampleType.a)) { + setverdict(pass); + } else { + setverdict(fail); + } + } + + +//###########################################################################// control { const recordOper_trecord cl_temp1:={ x1:=omit, x2:=3.4 }; // can constants be declared in the control part @@ -1613,5 +2386,20 @@ control { execute(tc_record_omit2()); execute(tc_record_omit_HQ51693()); execute(tc_recordOf_omit()); + + execute(tc_rec_template()); + execute(tc_rec_template_param()); + execute(tc_rec_template_param_modifies()); + + execute(tc_emb_rec_template()); + execute(tc_emb_rec_template_param()); + execute(tc_emb_rec_template_param_modifies()); + + execute(tc_anytype_rec_template()); + execute(tc_anytype_rec_template_param()); + execute(tc_anytype_rec_template_param_modifies()); } } +with { + extension "anytype ExampleType" +} \ No newline at end of file diff --git a/regression_test/templateInt/TtemplateInt.ttcn b/regression_test/templateInt/TtemplateInt.ttcn index 137516271b14cfcfea812022d8d9f80ed9a2f0df..54740a371a666a8e70909a1dd558e1e905f9d4b7 100644 --- a/regression_test/templateInt/TtemplateInt.ttcn +++ b/regression_test/templateInt/TtemplateInt.ttcn @@ -346,6 +346,35 @@ testcase templateIntReverseOrderImported2() runs on templateInt_mycomp { } } +template integer IntTemplateParam(template integer i := 3) := i; + +testcase templateIntParam() runs on templateInt_mycomp { + if (ispresent(IntTemplateParam)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (ispresent(IntTemplateParam(2))) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(IntTemplateParam)) { + setverdict(pass); + } else { + setverdict(fail); + } + + if (isbound(IntTemplateParam(2))) { + setverdict(pass); + } else { + setverdict(fail); + } +} + + control { execute(templateIntSpec()); execute(templateIntList()); @@ -363,5 +392,6 @@ control { execute(templateIntReverseOrder()); execute(templateIntReverseOrderImported()); execute(templateIntReverseOrderImported2()); + execute(templateIntParam()); } } diff --git a/regression_test/templateOmit/Common/Templates.ttcn b/regression_test/templateOmit/Common/Templates.ttcn index f6f57b680894f503af03939e262f12adcf1ca624..e83a1bc668897ed2d1fa7cc5b4e58e87d87aa69d 100644 --- a/regression_test/templateOmit/Common/Templates.ttcn +++ b/regression_test/templateOmit/Common/Templates.ttcn @@ -19,6 +19,8 @@ import from Types all; template integer t_int_value_list := ( 1, 3, 5, 7 ); template integer t_int_comp_list := complement ( 2, 4, 6, 8 ); +template integer t_int_comp_list_p(template integer ti := 2) := complement ( ti, 4, 6, 8 ); + template charstring t_char_value_list := ( "a", "aa", "aaa" ); template charstring t_char_comp_list := complement ( "b", "bb", "bbb" ); diff --git a/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn b/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn index 61c1a672b10237fdfb2b359b9adc7e8104984f86..f2cc45d8593f4a0263c5f7a29ac9a8ec7524f87a 100644 --- a/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn +++ b/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn @@ -96,6 +96,9 @@ testcase tc_ispresent_legacy() runs on CT if (ispresent(t_int_comp_list)) { setverdict(fail, t_int_comp_list, " should not be present"); } + if (ispresent(t_int_comp_list_p)) { + setverdict(fail, t_int_comp_list_p, " should not be present"); + } if (ispresent(t_char_comp_list)) { setverdict(fail, t_char_comp_list, " should not be present"); }