fixed compiler crash when passing an empty record as a function parameter (bug 498337)
authorBotond Baranyi <botond.baranyi@ericsson.com>
Fri, 22 Jul 2016 14:10:28 +0000 (16:10 +0200)
committerBotond Baranyi <botond.baranyi@ericsson.com>
Fri, 22 Jul 2016 14:10:28 +0000 (16:10 +0200)
Change-Id: I6752997dd65467f2040a036a05b4f0fc8a61e2b4
Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
compiler2/Type_chk.cc

index 54ef103b6b00e7809888e5c45c4d81f1c94487fb..323946926f33a1eaf19c0e6827995e347089b4b0 100644 (file)
@@ -4240,24 +4240,26 @@ bool Type::chk_this_value_Seq_T(Value *value, Common::Assignment *lhs, expected_
       is_empty = false;
     }
   }
-  if (is_empty) {
-    // all of the record's fields are unused (-), set the record to unused
-    // to avoid unnecessary code generation
-    value->set_valuetype(Value::V_NOTUSED);
-  }
-  else if (!incomplete_allowed || implicit_omit) {
+  if (!incomplete_allowed || implicit_omit) {
     for (size_t i = 0; i < n_type_comps; i++) {
       const Identifier& id = get_comp_byIndex(i)->get_name();
       if (!comp_map.has_key(id.get_name())) {
-        if (get_comp_byIndex(i)->get_is_optional() && implicit_omit)
+        if (get_comp_byIndex(i)->get_is_optional() && implicit_omit) {
           value->add_se_comp(new NamedValue(new Identifier(id),
             new Value(Value::V_OMIT)));
+          is_empty = false;
+        }
         else if (!incomplete_allowed)
           value->error("Field `%s' is missing from record value",
                      id.get_dispname().c_str());
       }
     }
   }
+  if (is_empty) {
+    // all of the record's fields are unused (-), set the record to unused
+    // to avoid unnecessary code generation
+    value->set_valuetype(Value::V_NOTUSED);
+  }
   comp_map.clear();
   return self_ref;
 }
@@ -4305,24 +4307,26 @@ bool Type::chk_this_value_Set_T(Value *value, Common::Assignment *lhs, expected_
       is_empty = false;
     }
   }
-  if (is_empty) {
-    // all of the set's fields are unused (-), set the set to unused to avoid
-    // unnecessary code generation
-    value->set_valuetype(Value::V_NOTUSED);
-  }
-  else if (!incomplete_allowed || implicit_omit) {
+  if (!incomplete_allowed || implicit_omit) {
     for (size_t i = 0; i < n_type_comps; i++) {
       const Identifier& id = get_comp_byIndex(i)->get_name();
       if(!comp_map.has_key(id.get_name())) {
-        if (get_comp_byIndex(i)->get_is_optional() && implicit_omit)
+        if (get_comp_byIndex(i)->get_is_optional() && implicit_omit) {
           value->add_se_comp(new NamedValue(new Identifier(id),
             new Value(Value::V_OMIT)));
+          is_empty = false;
+        }
         else if (!incomplete_allowed)
         value->error("Field `%s' is missing from set value %s",
                      id.get_dispname().c_str(), implicit_omit ? "yes" : "no");
       }
     }
   }
+  if (is_empty) {
+    // all of the set's fields are unused (-), set the set to unused to avoid
+    // unnecessary code generation
+    value->set_valuetype(Value::V_NOTUSED);
+  }
   comp_map.clear();
   return self_ref;
 }
This page took 0.030855 seconds and 5 git commands to generate.