提交 6bcf048a 编写于 作者: C Charles Stoner

Misc.

上级 aacb8bc6
...@@ -616,16 +616,16 @@ private void InheritNullableStateOfTrackableStruct(TypeSymbol targetType, int ta ...@@ -616,16 +616,16 @@ private void InheritNullableStateOfTrackableStruct(TypeSymbol targetType, int ta
// See ModifyMembers_StructPropertyNoBackingField and PropertyCycle_Struct tests. // See ModifyMembers_StructPropertyNoBackingField and PropertyCycle_Struct tests.
foreach (var field in _emptyStructTypeCache.GetStructInstanceFields(targetType)) foreach (var field in _emptyStructTypeCache.GetStructInstanceFields(targetType))
{ {
InheritNullableStateOfFieldOrProperty(targetSlot, valueSlot, field, isByRefTarget, slotWatermark); InheritNullableStateOfMember(targetSlot, valueSlot, field, isByRefTarget, slotWatermark);
} }
} }
// 'slotWatermark' is used to avoid inheriting members from inherited members. // 'slotWatermark' is used to avoid inheriting members from inherited members.
private void InheritNullableStateOfFieldOrProperty(int targetContainerSlot, int valueContainerSlot, Symbol fieldOrProperty, bool isByRefTarget, int slotWatermark) private void InheritNullableStateOfMember(int targetContainerSlot, int valueContainerSlot, Symbol member, bool isByRefTarget, int slotWatermark)
{ {
Debug.Assert(valueContainerSlot <= slotWatermark); Debug.Assert(valueContainerSlot <= slotWatermark);
TypeSymbolWithAnnotations fieldOrPropertyType = fieldOrProperty.GetTypeOrReturnType(); TypeSymbolWithAnnotations fieldOrPropertyType = member.GetTypeOrReturnType();
if (fieldOrPropertyType.IsReferenceType) if (fieldOrPropertyType.IsReferenceType)
{ {
...@@ -633,17 +633,17 @@ private void InheritNullableStateOfFieldOrProperty(int targetContainerSlot, int ...@@ -633,17 +633,17 @@ private void InheritNullableStateOfFieldOrProperty(int targetContainerSlot, int
// Declaration information takes priority. // Declaration information takes priority.
if (fieldOrPropertyType.IsNullable != false) if (fieldOrPropertyType.IsNullable != false)
{ {
int targetMemberSlot = GetOrCreateSlot(fieldOrProperty, targetContainerSlot); int targetMemberSlot = GetOrCreateSlot(member, targetContainerSlot);
bool? value = !fieldOrPropertyType.IsNullable; bool? value = !fieldOrPropertyType.IsNullable;
if (isByRefTarget) if (isByRefTarget)
{ {
// This is a property/field access through a by ref entity and it isn't considered declared as not-nullable. // This is a member access through a by ref entity and it isn't considered declared as not-nullable.
// Since reference can point to the heap, we cannot assume the property/field doesn't have null value after this assignment, // Since reference can point to the heap, we cannot assume the member doesn't have null value
// regardless of what value is being assigned. // after this assignment, regardless of what value is being assigned.
} }
else if (valueContainerSlot > 0) else if (valueContainerSlot > 0)
{ {
int valueMemberSlot = VariableSlot(fieldOrProperty, valueContainerSlot); int valueMemberSlot = VariableSlot(member, valueContainerSlot);
value = valueMemberSlot > 0 && valueMemberSlot < this.State.Capacity ? value = valueMemberSlot > 0 && valueMemberSlot < this.State.Capacity ?
this.State[valueMemberSlot] : this.State[valueMemberSlot] :
null; null;
...@@ -654,23 +654,23 @@ private void InheritNullableStateOfFieldOrProperty(int targetContainerSlot, int ...@@ -654,23 +654,23 @@ private void InheritNullableStateOfFieldOrProperty(int targetContainerSlot, int
if (valueContainerSlot > 0) if (valueContainerSlot > 0)
{ {
int valueMemberSlot = VariableSlot(fieldOrProperty, valueContainerSlot); int valueMemberSlot = VariableSlot(member, valueContainerSlot);
if (valueMemberSlot > 0 && valueMemberSlot <= slotWatermark) if (valueMemberSlot > 0 && valueMemberSlot <= slotWatermark)
{ {
int targetMemberSlot = GetOrCreateSlot(fieldOrProperty, targetContainerSlot); int targetMemberSlot = GetOrCreateSlot(member, targetContainerSlot);
InheritNullableStateOfTrackableType(targetMemberSlot, valueMemberSlot, isByRefTarget, slotWatermark); InheritNullableStateOfTrackableType(targetMemberSlot, valueMemberSlot, isByRefTarget, slotWatermark);
} }
} }
} }
else if (EmptyStructTypeCache.IsTrackableStructType(fieldOrPropertyType.TypeSymbol)) else if (EmptyStructTypeCache.IsTrackableStructType(fieldOrPropertyType.TypeSymbol))
{ {
int targetMemberSlot = GetOrCreateSlot(fieldOrProperty, targetContainerSlot); int targetMemberSlot = GetOrCreateSlot(member, targetContainerSlot);
if (targetMemberSlot > 0) if (targetMemberSlot > 0)
{ {
int valueMemberSlot = -1; int valueMemberSlot = -1;
if (valueContainerSlot > 0) if (valueContainerSlot > 0)
{ {
int slot = GetOrCreateSlot(fieldOrProperty, valueContainerSlot); int slot = GetOrCreateSlot(member, valueContainerSlot);
if (slot < slotWatermark) if (slot < slotWatermark)
{ {
valueMemberSlot = slot; valueMemberSlot = slot;
...@@ -712,8 +712,8 @@ private void InheritNullableStateOfTrackableType(int targetSlot, int valueSlot, ...@@ -712,8 +712,8 @@ private void InheritNullableStateOfTrackableType(int targetSlot, int valueSlot,
continue; continue;
} }
var member = variable.Symbol; var member = variable.Symbol;
Debug.Assert(member.Kind == SymbolKind.Field || member.Kind == SymbolKind.Property); Debug.Assert(member.Kind == SymbolKind.Field || member.Kind == SymbolKind.Property || member.Kind == SymbolKind.Event);
InheritNullableStateOfFieldOrProperty(targetSlot, valueSlot, member, isByRefTarget, slotWatermark); InheritNullableStateOfMember(targetSlot, valueSlot, member, isByRefTarget, slotWatermark);
} }
} }
......
...@@ -238,7 +238,7 @@ class C ...@@ -238,7 +238,7 @@ class C
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "int").WithArguments("System.Int32").WithLocation(4, 17)); Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "int").WithArguments("System.Int32").WithLocation(4, 17));
} }
[Fact] [ConditionalFact(typeof(DesktopOnly))]
public void UnannotatedAssemblies_WithSomeExtraAnnotations() public void UnannotatedAssemblies_WithSomeExtraAnnotations()
{ {
// PROTOTYPE(NullableReferenceTypes): external annotations should be removed or fully designed/productized // PROTOTYPE(NullableReferenceTypes): external annotations should be removed or fully designed/productized
...@@ -33885,6 +33885,30 @@ static void F() ...@@ -33885,6 +33885,30 @@ static void F()
Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "b.Q.P2").WithLocation(25, 9)); Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "b.Q.P2").WithLocation(25, 9));
} }
[Fact]
public void Members_ObjectInitializer_Events()
{
var source =
@"delegate void D();
class C
{
event D? E;
static void F()
{
C c;
c = new C() { };
c.E.Invoke(); // warning
c = new C() { E = F };
c.E.Invoke();
}
}";
var comp = CreateCompilation(source, parseOptions: TestOptions.Regular8);
comp.VerifyDiagnostics(
// (9,9): warning CS8602: Possible dereference of a null reference.
// c.E.Invoke(); // warning
Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "c.E").WithLocation(9, 9));
}
// PROTOTYPE(NullableReferenceTypes): Support assignment of derived type instances. // PROTOTYPE(NullableReferenceTypes): Support assignment of derived type instances.
[Fact(Skip = "TODO")] [Fact(Skip = "TODO")]
public void Members_ObjectInitializer_DerivedType() public void Members_ObjectInitializer_DerivedType()
...@@ -192,8 +192,6 @@ public enum OperationKind ...@@ -192,8 +192,6 @@ public enum OperationKind
ConstructorBodyOperation = 0x59, ConstructorBodyOperation = 0x59,
/// <summary>Indicates an <see cref="IDiscardOperation"/>.</summary> /// <summary>Indicates an <see cref="IDiscardOperation"/>.</summary>
Discard = 0x5A, Discard = 0x5A,
/// <summary>Indicates an <see cref="ISuppressNullableWarningOperation"/>.</summary>
SuppressNullableWarning = 0x5B,
/// <summary>Indicates an <see cref="IFlowCaptureOperation"/>.</summary> /// <summary>Indicates an <see cref="IFlowCaptureOperation"/>.</summary>
FlowCapture = 0x5B, FlowCapture = 0x5B,
...@@ -207,6 +205,8 @@ public enum OperationKind ...@@ -207,6 +205,8 @@ public enum OperationKind
StaticLocalInitializationSemaphore = 0x5F, StaticLocalInitializationSemaphore = 0x5F,
/// <summary>Indicates an <see cref="IFlowAnonymousFunctionOperation"/>.</summary> /// <summary>Indicates an <see cref="IFlowAnonymousFunctionOperation"/>.</summary>
FlowAnonymousFunction = 0x60, FlowAnonymousFunction = 0x60,
/// <summary>Indicates an <see cref="ISuppressNullableWarningOperation"/>.</summary>
SuppressNullableWarning = 0x61,
// /// <summary>Indicates an <see cref="IFixedOperation"/>.</summary> // /// <summary>Indicates an <see cref="IFixedOperation"/>.</summary>
// https://github.com/dotnet/roslyn/issues/21281 // https://github.com/dotnet/roslyn/issues/21281
......
...@@ -15,7 +15,7 @@ Microsoft.CodeAnalysis.FlowAnalysis.IIsNullOperation.Operand.get -> Microsoft.Co ...@@ -15,7 +15,7 @@ Microsoft.CodeAnalysis.FlowAnalysis.IIsNullOperation.Operand.get -> Microsoft.Co
Microsoft.CodeAnalysis.FlowAnalysis.IStaticLocalInitializationSemaphoreOperation Microsoft.CodeAnalysis.FlowAnalysis.IStaticLocalInitializationSemaphoreOperation
Microsoft.CodeAnalysis.FlowAnalysis.IStaticLocalInitializationSemaphoreOperation.Local.get -> Microsoft.CodeAnalysis.ILocalSymbol Microsoft.CodeAnalysis.FlowAnalysis.IStaticLocalInitializationSemaphoreOperation.Local.get -> Microsoft.CodeAnalysis.ILocalSymbol
Microsoft.CodeAnalysis.IOperation.SemanticModel.get -> Microsoft.CodeAnalysis.SemanticModel Microsoft.CodeAnalysis.IOperation.SemanticModel.get -> Microsoft.CodeAnalysis.SemanticModel
Microsoft.CodeAnalysis.OperationKind.SuppressNullableWarning = 91 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.SuppressNullableWarning = 97 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.Operations.CommonConversion.IsImplicit.get -> bool Microsoft.CodeAnalysis.Operations.CommonConversion.IsImplicit.get -> bool
Microsoft.CodeAnalysis.Operations.ISuppressNullableWarningOperation Microsoft.CodeAnalysis.Operations.ISuppressNullableWarningOperation
Microsoft.CodeAnalysis.Operations.ISuppressNullableWarningOperation.Expression.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Operations.ISuppressNullableWarningOperation.Expression.get -> Microsoft.CodeAnalysis.IOperation
......
...@@ -141,7 +141,7 @@ namespace N ...@@ -141,7 +141,7 @@ namespace N
Using state = CreateLibraryManager(GetWorkspaceDefinition(code, metaDatacode, False)) Using state = CreateLibraryManager(GetWorkspaceDefinition(code, metaDatacode, False))
Dim library = state.GetLibrary() Dim library = state.GetLibrary()
Dim list = library.GetProjectList().GetReferenceList(0).GetNamespaceList(0).GetTypeList(0) Dim list = library.GetProjectList().GetReferenceList(0).GetNamespaceList(0).GetTypeList(1)
list.VerifyNames("C", "C.PublicEnumTest") list.VerifyNames("C", "C.PublicEnumTest")
End Using End Using
End Sub End Sub
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册