}
//
- // 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;
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 ();
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) {
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)