Skip to content

Commit

Permalink
Ensure emit layer doesn't ignore diagnostics and dependencies for wel…
Browse files Browse the repository at this point in the history
…l known members. (#65320)

Closes #61631.
  • Loading branch information
AlekseyTs authored Nov 15, 2022
1 parent a148680 commit 9c28d50
Show file tree
Hide file tree
Showing 8 changed files with 248 additions and 52 deletions.
17 changes: 9 additions & 8 deletions src/Compilers/CSharp/Portable/CodeGen/CodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal sealed partial class CodeGenerator
private readonly BoundStatement _boundBody;
private readonly ILBuilder _builder;
private readonly PEModuleBuilder _module;
private readonly DiagnosticBag _diagnostics;
private readonly BindingDiagnosticBag _diagnostics;
private readonly ILEmitStyle _ilEmitStyle;
private readonly bool _emitPdbSequencePoints;

Expand Down Expand Up @@ -85,7 +85,7 @@ public CodeGenerator(
BoundStatement boundBody,
ILBuilder builder,
PEModuleBuilder moduleBuilder,
DiagnosticBag diagnostics,
BindingDiagnosticBag diagnostics,
OptimizationLevel optimizations,
bool emittingPdb)
{
Expand All @@ -94,6 +94,7 @@ public CodeGenerator(
Debug.Assert(builder != null);
Debug.Assert(moduleBuilder != null);
Debug.Assert(diagnostics != null);
Debug.Assert(diagnostics.DiagnosticBag != null);

_method = method;
_boundBody = boundBody;
Expand Down Expand Up @@ -177,7 +178,7 @@ private LocalDefinition LazyReturnTemp
var localSymbol = new SynthesizedLocal(_method, _method.ReturnTypeWithAnnotations, SynthesizedLocalKind.FunctionReturnValue, bodySyntax);

result = _builder.LocalSlotManager.DeclareLocal(
type: _module.Translate(localSymbol.Type, bodySyntax, _diagnostics),
type: _module.Translate(localSymbol.Type, bodySyntax, _diagnostics.DiagnosticBag),
symbol: localSymbol,
name: null,
kind: localSymbol.SynthesizedKind,
Expand Down Expand Up @@ -338,27 +339,27 @@ private void HandleReturn()

private void EmitTypeReferenceToken(Cci.ITypeReference symbol, SyntaxNode syntaxNode)
{
_builder.EmitToken(symbol, syntaxNode, _diagnostics);
_builder.EmitToken(symbol, syntaxNode, _diagnostics.DiagnosticBag);
}

private void EmitSymbolToken(TypeSymbol symbol, SyntaxNode syntaxNode)
{
EmitTypeReferenceToken(_module.Translate(symbol, syntaxNode, _diagnostics), syntaxNode);
EmitTypeReferenceToken(_module.Translate(symbol, syntaxNode, _diagnostics.DiagnosticBag), syntaxNode);
}

private void EmitSymbolToken(MethodSymbol method, SyntaxNode syntaxNode, BoundArgListOperator optArgList, bool encodeAsRawDefinitionToken = false)
{
_builder.EmitToken(_module.Translate(method, syntaxNode, _diagnostics, optArgList, needDeclaration: encodeAsRawDefinitionToken), syntaxNode, _diagnostics, encodeAsRawDefinitionToken);
_builder.EmitToken(_module.Translate(method, syntaxNode, _diagnostics.DiagnosticBag, optArgList, needDeclaration: encodeAsRawDefinitionToken), syntaxNode, _diagnostics.DiagnosticBag, encodeAsRawDefinitionToken);
}

private void EmitSymbolToken(FieldSymbol symbol, SyntaxNode syntaxNode)
{
_builder.EmitToken(_module.Translate(symbol, syntaxNode, _diagnostics), syntaxNode, _diagnostics);
_builder.EmitToken(_module.Translate(symbol, syntaxNode, _diagnostics.DiagnosticBag), syntaxNode, _diagnostics.DiagnosticBag);
}

private void EmitSignatureToken(FunctionPointerTypeSymbol symbol, SyntaxNode syntaxNode)
{
_builder.EmitToken(_module.Translate(symbol).Signature, syntaxNode, _diagnostics);
_builder.EmitToken(_module.Translate(symbol).Signature, syntaxNode, _diagnostics.DiagnosticBag);
}

private void EmitSequencePointStatement(BoundSequencePoint node)
Expand Down
2 changes: 1 addition & 1 deletion src/Compilers/CSharp/Portable/CodeGen/EmitAddress.cs
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ private void EmitArrayElementAddress(BoundArrayAccess arrayAccess, AddressKind a
else
{
_builder.EmitArrayElementAddress(_module.Translate((ArrayTypeSymbol)arrayAccess.Expression.Type),
arrayAccess.Syntax, _diagnostics);
arrayAccess.Syntax, _diagnostics.DiagnosticBag);
}
}

Expand Down
12 changes: 7 additions & 5 deletions src/Compilers/CSharp/Portable/CodeGen/EmitArrayInitializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private void EmitArrayInitializers(ArrayTypeSymbol arrayType, BoundArrayInitiali
else
{
ImmutableArray<byte> data = this.GetRawData(initExprs);
_builder.EmitArrayBlockInitializer(data, inits.Syntax, _diagnostics);
_builder.EmitArrayBlockInitializer(data, inits.Syntax, _diagnostics.DiagnosticBag);

if (initializationStyle == ArrayInitializerStyle.Mixed)
{
Expand Down Expand Up @@ -236,8 +236,7 @@ private bool EnableEnumArrayBlockInitialization
{
get
{
var sustainedLowLatency = _module.Compilation.GetWellKnownTypeMember(WellKnownMember.System_Runtime_GCLatencyMode__SustainedLowLatency);
return sustainedLowLatency != null && sustainedLowLatency.ContainingAssembly == _module.Compilation.Assembly.CorLibrary;
return _module.Compilation.EnableEnumArrayBlockInitialization;
}
}

Expand Down Expand Up @@ -384,12 +383,15 @@ private bool TryEmitReadonlySpanAsBlobWrapper(NamedTypeSymbol spanType, BoundExp
return false;
}

var ctor = ((MethodSymbol?)this._module.Compilation.GetWellKnownTypeMember(WellKnownMember.System_ReadOnlySpan_T__ctor_Pointer));
var ctor = (MethodSymbol?)Binder.GetWellKnownTypeMember(this._module.Compilation, WellKnownMember.System_ReadOnlySpan_T__ctor_Pointer, _diagnostics, syntax: wrappedExpression.Syntax, isOptional: true);

if (ctor == null)
{
return false;
}

Debug.Assert(!ctor.HasUnsupportedMetadata);

if (wrappedExpression is BoundArrayCreation ac)
{
var arrayType = (ArrayTypeSymbol)ac.Type;
Expand Down Expand Up @@ -471,7 +473,7 @@ private bool TryEmitReadonlySpanAsBlobWrapper(NamedTypeSymbol spanType, BoundExp
return false;
}

_builder.EmitArrayBlockFieldRef(data, wrappedExpression.Syntax, _diagnostics);
_builder.EmitArrayBlockFieldRef(data, wrappedExpression.Syntax, _diagnostics.DiagnosticBag!);
_builder.EmitIntConstant(lengthForConstructor);

if (inPlace)
Expand Down
12 changes: 6 additions & 6 deletions src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,7 @@ private void EmitThisReferenceExpression(BoundThisReference thisRef)

private void EmitPseudoVariableValue(BoundPseudoVariable expression, bool used)
{
EmitExpression(expression.EmitExpressions.GetValue(expression, _diagnostics), used);
EmitExpression(expression.EmitExpressions.GetValue(expression, _diagnostics.DiagnosticBag), used);
}

private void EmitSequencePointExpression(BoundSequencePointExpression node, bool used)
Expand Down Expand Up @@ -995,7 +995,7 @@ private void EmitArrayElementLoad(BoundArrayAccess arrayAccess, bool used)
}
else
{
_builder.EmitArrayElementLoad(_module.Translate((ArrayTypeSymbol)arrayAccess.Expression.Type), arrayAccess.Expression.Syntax, _diagnostics);
_builder.EmitArrayElementLoad(_module.Translate((ArrayTypeSymbol)arrayAccess.Expression.Type), arrayAccess.Expression.Syntax, _diagnostics.DiagnosticBag);
}

EmitPopIfUnused(used);
Expand Down Expand Up @@ -1934,7 +1934,7 @@ private void EmitArrayCreationExpression(BoundArrayCreation expression, bool use
}
else
{
_builder.EmitArrayCreation(_module.Translate(arrayType), expression.Syntax, _diagnostics);
_builder.EmitArrayCreation(_module.Translate(arrayType), expression.Syntax, _diagnostics.DiagnosticBag);
}

if (expression.InitializerOpt != null)
Expand Down Expand Up @@ -2752,7 +2752,7 @@ private void EmitArrayElementStore(ArrayTypeSymbol arrayType, SyntaxNode syntaxN
}
else
{
_builder.EmitArrayElementStore(_module.Translate(arrayType), syntaxNode, _diagnostics);
_builder.EmitArrayElementStore(_module.Translate(arrayType), syntaxNode, _diagnostics.DiagnosticBag);
}
}

Expand Down Expand Up @@ -3111,7 +3111,7 @@ private void EmitModuleVersionIdStore(BoundModuleVersionId node)

private void EmitModuleVersionIdToken(BoundModuleVersionId node)
{
_builder.EmitToken(_module.GetModuleVersionId(_module.Translate(node.Type, node.Syntax, _diagnostics), node.Syntax, _diagnostics), node.Syntax, _diagnostics);
_builder.EmitToken(_module.GetModuleVersionId(_module.Translate(node.Type, node.Syntax, _diagnostics.DiagnosticBag), node.Syntax, _diagnostics.DiagnosticBag), node.Syntax, _diagnostics.DiagnosticBag);
}

private void EmitModuleVersionIdStringLoad(BoundModuleVersionIdString node)
Expand All @@ -3134,7 +3134,7 @@ private void EmitInstrumentationPayloadRootStore(BoundInstrumentationPayloadRoot

private void EmitInstrumentationPayloadRootToken(BoundInstrumentationPayloadRoot node)
{
_builder.EmitToken(_module.GetInstrumentationPayloadRoot(node.AnalysisKind, _module.Translate(node.Type, node.Syntax, _diagnostics), node.Syntax, _diagnostics), node.Syntax, _diagnostics);
_builder.EmitToken(_module.GetInstrumentationPayloadRoot(node.AnalysisKind, _module.Translate(node.Type, node.Syntax, _diagnostics.DiagnosticBag), node.Syntax, _diagnostics.DiagnosticBag), node.Syntax, _diagnostics.DiagnosticBag);
}

private void EmitSourceDocumentIndex(BoundSourceDocumentIndex node)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ private void EmitStackAllocInitializers(TypeSymbol type, BoundArrayInitializatio
ImmutableArray<byte> data = this.GetRawData(initExprs);
if (data.All(datum => datum == data[0]))
{
_builder.EmitStackAllocBlockInitializer(data, inits.Syntax, emitInitBlock: true, _diagnostics);
_builder.EmitStackAllocBlockInitializer(data, inits.Syntax, emitInitBlock: true, _diagnostics.DiagnosticBag);

if (initializationStyle == ArrayInitializerStyle.Mixed)
{
Expand All @@ -45,7 +45,7 @@ private void EmitStackAllocInitializers(TypeSymbol type, BoundArrayInitializatio
}
else if (elementType.SpecialType.SizeInBytes() == 1)
{
_builder.EmitStackAllocBlockInitializer(data, inits.Syntax, emitInitBlock: false, _diagnostics);
_builder.EmitStackAllocBlockInitializer(data, inits.Syntax, emitInitBlock: false, _diagnostics.DiagnosticBag);

if (initializationStyle == ArrayInitializerStyle.Mixed)
{
Expand Down
Loading

0 comments on commit 9c28d50

Please sign in to comment.