public override void Emit ()
{
+ if (Interfaces != null) {
+ foreach (var iface in Interfaces) {
+ if (iface.HasNamedTupleElement) {
+ throw new NotImplementedException ("named tuples for .interfaceimpl");
+ }
+ }
+ }
+
if (OptAttributes != null)
OptAttributes.Emit ();
if ((ModFlags & Modifiers.METHOD_EXTENSION) != 0)
Module.PredefinedAttributes.Extension.EmitAttribute (TypeBuilder);
- if (base_type != null && base_type.HasDynamicElement) {
- Module.PredefinedAttributes.Dynamic.EmitAttribute (TypeBuilder, base_type, Location);
+ if (base_type != null) {
+ if (base_type.HasDynamicElement)
+ Module.PredefinedAttributes.Dynamic.EmitAttribute (TypeBuilder, base_type, Location);
+ if (base_type.HasNamedTupleElement)
+ Module.PredefinedAttributes.TupleElementNames.EmitAttribute (TypeBuilder, base_type, Location);
}
}
Modifiers.PROTECTED |
Modifiers.INTERNAL |
Modifiers.UNSAFE |
- Modifiers.PRIVATE;
+ Modifiers.PRIVATE |
+ Modifiers.READONLY;
public Struct (TypeContainer parent, MemberName name, Modifiers mod, Attributes attrs)
: base (parent, name, attrs, MemberKind.Struct)
public override void Emit ()
{
+ if ((ModFlags & Modifiers.READONLY) != 0)
+ Module.PredefinedAttributes.IsReadOnly.EmitAttribute (TypeBuilder);
+
CheckStructCycles ();
base.Emit ();
ok = false;
}
- var base_member_type = ((IInterfaceMemberSpec) base_member).MemberType;
+ var base_member_type = ((IInterfaceMemberSpec)base_member).MemberType;
if (!TypeSpecComparer.Override.IsEqual (MemberType, base_member_type)) {
Report.SymbolRelatedToPreviousError (base_member);
- if (this is PropertyBasedMember) {
+ if (((base_member_type.Kind ^ MemberType.Kind) & MemberKind.ByRef) != 0) {
+ Report.Error (8148, Location, "`{0}': must {2}return by reference to match overridden member `{1}'",
+ GetSignatureForError (), base_member.GetSignatureForError (), base_member_type.Kind == MemberKind.ByRef ? "" : "not ");
+ } else if (this is PropertyBasedMember) {
Report.Error (1715, Location, "`{0}': type must be `{1}' to match overridden member `{2}'",
GetSignatureForError (), base_member_type.GetSignatureForError (), base_member.GetSignatureForError ());
} else {
GetSignatureForError (), base_member_type.GetSignatureForError (), base_member.GetSignatureForError ());
}
ok = false;
+ } else if (!NamedTupleSpec.CheckOverrideName (MemberType, base_member_type)) {
+ // CSC: Should be different error code
+ Report.Error (8139, Location, "`{0}': cannot change return type tuple element names when overriding inherited member `{1}'",
+ GetSignatureForError (), base_member.GetSignatureForError ());
+ ok = false;
+ }
+
+ var base_params = base_member as IParametersMember;
+ if (base_params != null) {
+ if (!NamedTupleSpec.CheckOverrideName ((IParametersMember)this, base_params)) {
+ Report.Error (8139, Location, "`{0}': cannot change tuple element names when overriding inherited member `{1}'",
+ GetSignatureForError (), base_member.GetSignatureForError ());
+ ok = false;
+ }
}
return ok;