This conveniently moves 2 error reports from codegen to semantic check too.
pop_context ();
}
} else if (f.binding == MemberBinding.CLASS) {
- if (!is_gtypeinstance) {
- Report.error (f.source_reference, "class fields are not supported in compact classes");
- f.error = true;
- return;
- }
-
if (f.access == SymbolAccessibility.PRIVATE) {
var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (get_ccode_upper_case_name (cl))));
ccall.add_argument (new CCodeIdentifier ("klass"));
string macro = "(G_TYPE_CLASS_GET_PRIVATE (klass, %s, %sClassPrivate))".printf (get_ccode_type_id (cl), get_ccode_name (cl));
decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_CLASS_PRIVATE(klass)".printf (get_ccode_upper_case_name (cl, null)), macro));
}
- } else {
- if (cl.has_private_fields) {
- Report.error (cl.source_reference, "Private fields not supported in compact classes");
- }
}
}
semantic/chainup-gobject-unsupported-type-property.test \
semantic/class-base-type-invalid.test \
semantic/class-base-type-less-accessible.test \
+ semantic/class-compact-field-class.test \
+ semantic/class-compact-field-lock.test \
+ semantic/class-compact-field-private.test \
semantic/class-compact-derived-instance-field.test \
semantic/class-compact-interface.test \
semantic/class-compact-method-baseaccess.test \
--- /dev/null
+Invalid Code
+
+[Compact]
+class Foo {
+ public class int i;
+}
+
+void main () {
+}
--- /dev/null
+Invalid Code
+
+[Compact]
+class Foo {
+ public int i;
+ public void foo () {
+ lock (i) {
+ }
+ }
+}
+
+void main () {
+}
--- /dev/null
+Invalid Code
+
+[Compact]
+class Foo {
+ int i;
+}
+
+void main () {
+}
}
foreach (Field f in get_fields ()) {
+ if (is_compact && f.binding != MemberBinding.STATIC) {
+ //FIXME Should external bindings follow this too?
+ if (!external_package && f.access == SymbolAccessibility.PRIVATE) {
+ Report.error (source_reference, "private fields are not supported in compact classes");
+ error = true;
+ }
+ if (f.binding == MemberBinding.CLASS) {
+ Report.error (f.source_reference, "class fields are not supported in compact classes");
+ error = true;
+ }
+ }
+
f.check (context);
}
error = true;
resource.error = true;
Report.error (resource.source_reference, "Only members of the current class are lockable");
+ return false;
+ }
+
+ /* parent class must not be compact */
+ if (context.analyzer.current_class.is_compact) {
+ error = true;
+ resource.error = true;
+ Report.error (resource.source_reference, "Only members of the non-compact classes are lockable");
+ return false;
}
((Lockable) resource.symbol_reference).lock_used = true;
error = true;
resource.error = true;
Report.error (resource.source_reference, "Only members of the current class are lockable");
+ return false;
+ }
+
+ /* parent class must not be compact */
+ if (context.analyzer.current_class.is_compact) {
+ error = true;
+ resource.error = true;
+ Report.error (resource.source_reference, "Only members of the non-compact classes are lockable");
+ return false;
}
((Lockable) resource.symbol_reference).lock_used = true;