diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 9d754d17..aacada68 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -3488,6 +3488,7 @@ void BfCompiler::UpdateRevisedTypes() compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode; compositeTypeDef->mFullName = rootTypeDef->mFullName; compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx; + compositeTypeDef->mIsOpaque = rootTypeDef->mIsOpaque; compositeTypeDef->mIsFunction = rootTypeDef->mIsFunction; compositeTypeDef->mIsDelegate = rootTypeDef->mIsDelegate; compositeTypeDef->mIsCombinedPartial = true; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 55977e2c..feaf80f0 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5595,6 +5595,21 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if ((!fieldDef->mIsConst) && (!fieldDef->mIsStatic)) { + BfAstNode* nameRefNode = NULL; + if (auto fieldDecl = fieldDef->GetFieldDeclaration()) + nameRefNode = fieldDecl->mNameNode; + else if (auto paramDecl = fieldDef->GetParamDeclaration()) + nameRefNode = paramDecl->mNameNode; + if (nameRefNode == NULL) + nameRefNode = fieldDef->mTypeRef; + + if ((!resolvedFieldType->IsValuelessType()) && (typeDef->mIsOpaque)) + { + Fail(StrFormat("Opaque type '%s' attempted to declare non-static field '%s'", TypeToString(typeInstance).c_str(), fieldDef->mName.c_str()), nameRefNode, true); + resolvedFieldType = GetPrimitiveType(BfTypeCode_None); + fieldInstance->mResolvedType = resolvedFieldType; + } + PopulateType(resolvedFieldType, resolvedFieldType->IsValueType() ? BfPopulateType_Data : BfPopulateType_Declaration); if (resolvedFieldType->WantsGCMarking()) typeInstance->mWantsGCMarking = true; @@ -5611,15 +5626,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (fieldDef->mIsExtern) { Fail("Cannot declare instance member as 'extern'", fieldDef->GetFieldDeclaration()->mExternSpecifier, true); - } - - BfAstNode* nameRefNode = NULL; - if (auto fieldDecl = fieldDef->GetFieldDeclaration()) - nameRefNode = fieldDecl->mNameNode; - else if (auto paramDecl = fieldDef->GetParamDeclaration()) - nameRefNode = paramDecl->mNameNode; - if (nameRefNode == NULL) - nameRefNode = fieldDef->mTypeRef; + } if (!allowInstanceFields) { @@ -5677,7 +5684,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } else if (!resolvedFieldType->IsObject()) Fail("Append fields must be classes", nameRefNode, true); - } + } BF_ASSERT(dataSize >= 0); fieldInstance->mDataSize = dataSize; diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index 13813e16..9dbe5c53 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -3207,6 +3207,7 @@ void BfSystem::AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* co typeDef->mSystem = partialTypeDef->mSystem; typeDef->mTypeCode = partialTypeDef->mTypeCode; typeDef->mShow = partialTypeDef->mShow; + typeDef->mIsOpaque = partialTypeDef->mIsOpaque; typeDef->mIsFunction = partialTypeDef->mIsFunction; typeDef->mIsDelegate = partialTypeDef->mIsDelegate; typeDef->mNestDepth = partialTypeDef->mNestDepth;