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