}
//
- // Any unattached attributes during parsing get added here. User
+ // Any unattached attributes during parsing get added here. Used
// by FULL_AST mode
//
public Attributes UnattachedAttributes {
bool has_normal_indexers;
string indexer_name;
- protected bool requires_delayed_unmanagedtype_check;
bool error;
bool members_defined;
bool members_defined_ok;
TypeParameterSpec[] ITypeDefinition.TypeParameters {
get {
- return PartialContainer.CurrentTypeParameters.Types;
+ var ctp = PartialContainer.CurrentTypeParameters;
+ return ctp == null ? TypeParameterSpec.EmptyTypes : ctp.Types;
}
}
return;
foreach (var member in members) {
- var pbm = member as PropertyBasedMember;
- if (pbm != null) {
+ var pbm = member as MemberBase;
+ if (pbm != null)
pbm.PrepareEmit ();
- continue;
- }
-
- var mc = member as MethodCore;
- if (mc != null) {
- mc.PrepareEmit ();
- continue;
- }
-
- var c = member as Const;
- if (c != null)
- c.DefineValue ();
}
base.PrepareEmit ();
this.spec = spec;
current_type = null;
+ if (class_partial_parts != null) {
+ foreach (var part in class_partial_parts)
+ part.spec = spec;
+ }
}
public override void RemoveContainer (TypeContainer cont)
if (compiled_iface != null)
compiled_iface.Define ();
- ObsoleteAttribute oa = iface_type.GetAttributeObsolete ();
- if (oa != null && !IsObsolete)
- AttributeTester.Report_ObsoleteMessage (oa, iface_type.GetSignatureForError (), Location, Report);
+ iface_type.CheckObsoleteness (this, Location);
if (iface_type.Arity > 0) {
// TODO: passing `this' is wrong, should be base type iface instead
// Run checks skipped during DefineType (e.g FullNamedExpression::ResolveAsType)
//
if (base_type_expr != null) {
- ObsoleteAttribute obsolete_attr = base_type.GetAttributeObsolete ();
- if (obsolete_attr != null && !IsObsolete)
- AttributeTester.Report_ObsoleteMessage (obsolete_attr, base_type.GetSignatureForError (), base_type_expr.Location, Report);
+ base_type.CheckObsoleteness (this, base_type_expr.Location);
if (IsGenericOrParentIsGeneric && base_type.IsAttribute) {
Report.Error (698, base_type_expr.Location,
CheckPairedOperators ();
}
- if (requires_delayed_unmanagedtype_check) {
- requires_delayed_unmanagedtype_check = false;
- foreach (var member in members) {
- var f = member as Field;
- if (f != null && f.MemberType != null && f.MemberType.IsPointer)
- TypeManager.VerifyUnmanaged (Module, f.MemberType, f.Location);
- }
- }
-
ComputeIndexerName();
if (HasEquals && !HasGetHashCode) {
return true;
}
+ public override void PrepareEmit ()
+ {
+ var s = this as Struct;
+ if (s == null || !s.HasUnmanagedCheckDone) {
+ for (int i = 0; i < Members.Count; ++i) {
+ var f = Members [i] as Field;
+ if (f == null || f.MemberType == null || !f.MemberType.IsPointer)
+ continue;
+
+ TypeManager.VerifyUnmanaged (Module, f.MemberType, f.Location);
+ }
+ }
+
+ base.PrepareEmit ();
+ }
+
public override void Emit ()
{
if (!has_static_constructor && HasStaticFieldInitializer) {
public sealed class Struct : ClassOrStruct
{
- bool is_unmanaged, has_unmanaged_check_done;
+ bool is_unmanaged, has_unmanaged_check_done, requires_delayed_unmanagedtype_check;
bool InTransit;
// <summary>
base.Emit ();
}
+ public bool HasUnmanagedCheckDone {
+ get {
+ return has_unmanaged_check_done;
+ }
+ }
+
bool HasUserDefaultConstructor ()
{
foreach (var m in PartialContainer.Members) {
ModFlags |= Modifiers.NEW;
if (!IsCompilerGenerated) {
Report.SymbolRelatedToPreviousError (base_member);
- if (!IsInterface && (base_member.Modifiers & (Modifiers.ABSTRACT | Modifiers.VIRTUAL | Modifiers.OVERRIDE)) != 0) {
+ if ((base_member.Kind & MemberKind.NestedMask) == 0 && !IsInterface && (base_member.Modifiers & (Modifiers.ABSTRACT | Modifiers.VIRTUAL | Modifiers.OVERRIDE)) != 0) {
Report.Warning (114, 2, Location, "`{0}' hides inherited member `{1}'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword",
GetSignatureForError (), base_member.GetSignatureForError ());
} else {
}
if (!IsInterface && base_member.IsAbstract && !overrides && !IsStatic) {
- Report.SymbolRelatedToPreviousError (base_member);
- Report.Error (533, Location, "`{0}' hides inherited abstract member `{1}'",
- GetSignatureForError (), base_member.GetSignatureForError ());
+ switch (base_member.Kind) {
+ case MemberKind.Event:
+ case MemberKind.Indexer:
+ case MemberKind.Method:
+ case MemberKind.Property:
+ Report.SymbolRelatedToPreviousError (base_member);
+ Report.Error (533, Location, "`{0}' hides inherited abstract member `{1}'",
+ GetSignatureForError (), base_member.GetSignatureForError ());
+ break;
+ }
}
}
get {
return type_expr;
}
+ set {
+ type_expr = value;
+ }
}
#endregion
return Parent.GetSignatureForDocumentation () + "." + MemberName.Basename;
}
+ public virtual void PrepareEmit ()
+ {
+ if (member_type != null && type_expr != null)
+ member_type.CheckObsoleteness (this, type_expr.Location);
+ }
+
protected virtual bool ResolveMemberType ()
{
if (member_type != null)