}
}
- decl_space.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (st.get_cname ()), new CCodeVariableDeclarator (st.get_cname ())));
+ if (st.base_struct == null) {
+ decl_space.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (st.get_cname ()), new CCodeVariableDeclarator (st.get_cname ())));
- decl_space.add_type_definition (instance_struct);
+ decl_space.add_type_definition (instance_struct);
+ } else {
+ decl_space.add_type_declaration (new CCodeTypeDefinition (st.base_struct.get_cname (), new CCodeVariableDeclarator (st.get_cname ())));
+ }
var function = new CCodeFunction (st.get_dup_function (), st.get_cname () + "*");
if (st.is_private_symbol ()) {
prop.check (analyzer);
}
- if (!external && !external_package && base_type == null && get_fields ().size == 0
- && !is_boolean_type () && !is_integer_type () && !is_floating_type ()) {
- error = true;
- Report.error (source_reference, "structs cannot be empty: %s".printf(name));
+ if (!external && !external_package) {
+ if (base_type == null && get_fields ().size == 0 && !is_boolean_type () && !is_integer_type () && !is_floating_type ()) {
+ error = true;
+ Report.error (source_reference, "structs cannot be empty: %s".printf(name));
+ } else if (base_type != null) {
+ foreach (Field f in fields) {
+ if (f.binding == MemberBinding.INSTANCE) {
+ error = true;
+ Report.error (source_reference, "derived structs may not have instance fields");
+ break;
+ }
+ }
+ }
}
analyzer.current_source_file = old_source_file;