提交 af3c6740 编写于 作者: T Ty Overby

Merge pull request #5398 from TyOverby/4578-wildcard-deterministic

Ban assembly versions with wildcards in deterministic builds
...@@ -2073,7 +2073,7 @@ private void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<Attr ...@@ -2073,7 +2073,7 @@ private void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<Attr
{ {
string verString = (string)attribute.CommonConstructorArguments[0].Value; string verString = (string)attribute.CommonConstructorArguments[0].Value;
Version version; Version version;
if (!VersionHelper.TryParseAssemblyVersion(verString, allowWildcard: true, version: out version)) if (!VersionHelper.TryParseAssemblyVersion(verString, allowWildcard: !_compilation.IsEmitDeterministic, version: out version))
{ {
Location attributeArgumentSyntaxLocation = attribute.GetAttributeArgumentSyntaxLocation(0, arguments.AttributeSyntaxOpt); Location attributeArgumentSyntaxLocation = attribute.GetAttributeArgumentSyntaxLocation(0, arguments.AttributeSyntaxOpt);
arguments.Diagnostics.Add(ErrorCode.ERR_InvalidVersionFormat, attributeArgumentSyntaxLocation); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidVersionFormat, attributeArgumentSyntaxLocation);
......
...@@ -51,6 +51,21 @@ private ImmutableArray<byte> EmitDeterministic(string source, Platform platform, ...@@ -51,6 +51,21 @@ private ImmutableArray<byte> EmitDeterministic(string source, Platform platform,
return compilation.EmitToArray(EmitOptions.Default.WithDebugInformationFormat(pdbFormat), pdbStream: new MemoryStream()); return compilation.EmitToArray(EmitOptions.Default.WithDebugInformationFormat(pdbFormat), pdbStream: new MemoryStream());
} }
[Fact, WorkItem(4578, "https://github.com/dotnet/roslyn/issues/4578")]
public void BanVersionWildcards()
{
string source = @"[assembly: System.Reflection.AssemblyVersion(""10101.0.*"")] public class C {}";
var compilationDeterministic = CreateCompilation(source, assemblyName: "DeterminismTest", references: new[] { MscorlibRef },
parseOptions: TestOptions.Regular.WithFeature("deterministic", "true"));
var compilationNonDeterministic = CreateCompilation(source, assemblyName: "DeterminismTest", references: new[] { MscorlibRef });
var resultDeterministic = compilationDeterministic.Emit(Stream.Null, Stream.Null);
var resultNonDeterministic = compilationNonDeterministic.Emit(Stream.Null, Stream.Null);
Assert.False(resultDeterministic.Success);
Assert.True(resultNonDeterministic.Success);
}
[Fact, WorkItem(372, "https://github.com/dotnet/roslyn/issues/372")] [Fact, WorkItem(372, "https://github.com/dotnet/roslyn/issues/372")]
public void Simple() public void Simple()
{ {
......
...@@ -998,7 +998,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ...@@ -998,7 +998,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
ElseIf attrData.IsTargetAttribute(Me, AttributeDescription.AssemblyVersionAttribute) Then ElseIf attrData.IsTargetAttribute(Me, AttributeDescription.AssemblyVersionAttribute) Then
Dim verString = DirectCast(attrData.CommonConstructorArguments(0).Value, String) Dim verString = DirectCast(attrData.CommonConstructorArguments(0).Value, String)
Dim version As Version = Nothing Dim version As Version = Nothing
If Not VersionHelper.TryParseAssemblyVersion(verString, allowWildcard:=True, version:=version) Then If Not VersionHelper.TryParseAssemblyVersion(verString, allowWildcard:=Not _compilation.IsEmitDeterministic, version:=version) Then
arguments.Diagnostics.Add(ERRID.ERR_InvalidVersionFormat, GetAssemblyAttributeFirstArgumentLocation(arguments.AttributeSyntaxOpt)) arguments.Diagnostics.Add(ERRID.ERR_InvalidVersionFormat, GetAssemblyAttributeFirstArgumentLocation(arguments.AttributeSyntaxOpt))
End If End If
arguments.GetOrCreateData(Of CommonAssemblyWellKnownAttributeData)().AssemblyVersionAttributeSetting = version arguments.GetOrCreateData(Of CommonAssemblyWellKnownAttributeData)().AssemblyVersionAttributeSetting = version
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System Imports System
Imports System.IO
Imports System.Collections.Generic Imports System.Collections.Generic
Imports System.Collections.Immutable Imports System.Collections.Immutable
Imports System.Threading Imports System.Threading
...@@ -25,6 +26,25 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Emit ...@@ -25,6 +26,25 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Emit
Return compilation.EmitToArray() Return compilation.EmitToArray()
End Function End Function
<Fact>
Public Sub BanVersionWildcards()
Dim source =
"<assembly: System.Reflection.AssemblyVersion(""10101.0.*"")>
Class C
Shared Sub Main()
End Sub
End Class"
Dim compilationDeterministic = CreateCompilationWithMscorlib({source}, assemblyName:="DeterminismTest",
parseOptions:=TestOptions.Regular.WithFeature("deterministic", "true"))
Dim compilationNonDeterministic = CreateCompilationWithMscorlib({source}, assemblyName:="DeterminismTest")
Dim resultDeterministic = compilationDeterministic.Emit(Stream.Null, Stream.Null)
Dim resultNonDeterministic = compilationNonDeterministic.Emit(Stream.Null, Stream.Null)
Assert.False(resultDeterministic.Success)
Assert.True(resultNonDeterministic.Success)
End Sub
<Fact> <Fact>
Public Sub CompareAllBytesEmitted_Release() Public Sub CompareAllBytesEmitted_Release()
Dim source = Dim source =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册