Fixed: clearscope should also clear the inherited scope (through struct member access chain); Fixed: struct member access chain should ONLY work for structs (forgot that FxClassMember inherits FxStructMember)

This commit is contained in:
ZZYZX 2017-03-04 00:04:19 +02:00
parent 723f9770a4
commit c9a994a885
7 changed files with 42 additions and 36 deletions

View file

@ -6879,7 +6879,7 @@ FxExpression *FxStructMember::Resolve(FCompileContext &ctx)
}
BarrierSide = scopeBarrier.sidelast;
if (classx->ExprType == EFX_StructMember) // note: only do this for structs now
if (classx->ExprType == EFX_StructMember && ExprType == EFX_StructMember) // note: only do this for structs now
{
FxStructMember* pmember = (FxStructMember*)classx;
if (BarrierSide == FScopeBarrier::Side_PlainData && pmember)
@ -8175,11 +8175,14 @@ isresolved:
innerside = FScopeBarrier::SideFromObjectFlags(cls->ObjectFlags);
innerflags = FScopeBarrier::FlagsFromSide(innerside);
}
if (Self->ExprType == EFX_StructMember)
else if (innerside != FScopeBarrier::Side_Clear)
{
FxStructMember* pmember = (FxStructMember*)Self;
if (innerside == FScopeBarrier::Side_PlainData)
innerflags = FScopeBarrier::ChangeSideInFlags(innerflags, pmember->BarrierSide);
if (Self->ExprType == EFX_StructMember)
{
FxStructMember* pmember = (FxStructMember*)Self;
if (innerside == FScopeBarrier::Side_PlainData)
innerflags = FScopeBarrier::ChangeSideInFlags(innerflags, pmember->BarrierSide);
}
}
FScopeBarrier scopeBarrier(outerflags, innerflags, MethodName.GetChars());
if (!scopeBarrier.callable)