提交 1ec0ba66 编写于 作者: J Jared Parsons

Move to NetStandard2.0 RTM for our ref assemblies

This changes the reference assemblies we use for the CoreClr compiler
compilation to be Net Standard 2.0 RTM. Previously they were a beta
version.

This did mean a number of tests had to be moved to be desktop specific
again. This is primarily due to the presence of ValueTuple as a default
type in Net Standard 2.0. Tests that relied on ValueTuple not being
defined had to be moved to net461 which doesn't have that type defined
by default.
上级 3a3ba133
......@@ -28,7 +28,7 @@
<MicrosoftCodeAnalysisCSharpWorkspacesVersion>1.0.1</MicrosoftCodeAnalysisCSharpWorkspacesVersion>
<MicrosoftCodeAnalysisEditorFeaturesTextVersion>1.0.1</MicrosoftCodeAnalysisEditorFeaturesTextVersion>
<MicrosoftCodeAnalysisElfieVersion>0.10.6</MicrosoftCodeAnalysisElfieVersion>
<MicrosoftCodeAnalysisTestResourcesProprietaryVersion>2.0.0-pre-20170517</MicrosoftCodeAnalysisTestResourcesProprietaryVersion>
<MicrosoftCodeAnalysisTestResourcesProprietaryVersion>2.0.3</MicrosoftCodeAnalysisTestResourcesProprietaryVersion>
<MicrosoftCodeAnalysisVisualBasicVersion>1.0.1</MicrosoftCodeAnalysisVisualBasicVersion>
<MicrosoftCodeAnalysisVisualBasicWorkspacesVersion>1.0.1</MicrosoftCodeAnalysisVisualBasicWorkspacesVersion>
<MicrosoftCodeAnalysisWorkspacesCommonVersion>1.0.1</MicrosoftCodeAnalysisWorkspacesCommonVersion>
......
......@@ -2547,15 +2547,15 @@ public void MissingAssemblyResolution1()
public void MissingAssemblyResolution_Aliases()
{
// c - a -> b with alias X
var bRef = CreateStandardCompilation("public class B { }", assemblyName: "B").EmitToImageReference();
var aRef = CreateStandardCompilation("public class A : B { }", new[] { bRef }, assemblyName: "A").EmitToImageReference();
var bRef = CreateCompilationWithMscorlib46("public class B { }", assemblyName: "B").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46("public class A : B { }", new[] { bRef }, assemblyName: "A").EmitToImageReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>
{
{ "B", bRef.WithAliases(ImmutableArray.Create("X")) }
});
var c = CreateStandardCompilation(@"
var c = CreateCompilationWithMscorlib46(@"
extern alias X;
public class C : A
......@@ -2701,12 +2701,12 @@ public void MissingAssemblyResolution_None()
{
// c - a -> d
// - d
var dRef = CreateStandardCompilation("public interface D { }", assemblyName: "D").EmitToImageReference();
var aRef = CreateStandardCompilation("public interface A : D { }", new[] { dRef }, assemblyName: "A").ToMetadataReference();
var dRef = CreateCompilationWithMscorlib46("public interface D { }", assemblyName: "D").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46("public interface A : D { }", new[] { dRef }, assemblyName: "A").ToMetadataReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>());
var c = CreateStandardCompilation("public interface C : A { }", new[] { aRef, dRef },
var c = CreateCompilationWithMscorlib46("public interface C : A { }", new[] { aRef, dRef },
TestOptions.ReleaseDll.WithMetadataReferenceResolver(resolver));
c.VerifyDiagnostics();
......@@ -2717,12 +2717,12 @@ public void MissingAssemblyResolution_None()
public void MissingAssemblyResolution_ActualMissing()
{
// c - a -> d
var dRef = CreateStandardCompilation("public interface D { }", assemblyName: "D").EmitToImageReference();
var aRef = CreateStandardCompilation("public interface A : D { }", new[] { dRef }, assemblyName: "A").ToMetadataReference();
var dRef = CreateCompilationWithMscorlib46("public interface D { }", assemblyName: "D").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46("public interface A : D { }", new[] { dRef }, assemblyName: "A").ToMetadataReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>());
var c = CreateStandardCompilation("public interface C : A { }", new[] { aRef },
var c = CreateCompilationWithMscorlib46("public interface C : A { }", new[] { aRef },
TestOptions.ReleaseDll.WithMetadataReferenceResolver(resolver));
c.VerifyDiagnostics(
......@@ -2740,17 +2740,17 @@ public void MissingAssemblyResolution_ActualMissing()
public void MissingAssemblyResolution_MissingDueToResolutionMismatch()
{
// c - a -> b
var bRef = CreateStandardCompilation("public interface D { }", assemblyName: "B").EmitToImageReference();
var aRef = CreateStandardCompilation("public interface A : D { }", new[] { bRef }, assemblyName: "A").ToMetadataReference();
var bRef = CreateCompilationWithMscorlib46("public interface D { }", assemblyName: "B").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46("public interface A : D { }", new[] { bRef }, assemblyName: "A").ToMetadataReference();
var eRef = CreateStandardCompilation("public interface E { }", assemblyName: "E").ToMetadataReference();
var eRef = CreateCompilationWithMscorlib46("public interface E { }", assemblyName: "E").ToMetadataReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>
{
{ "B, 1.0.0.0", eRef },
});
var c = CreateStandardCompilation(@"public interface C : A { }", new[] { aRef },
var c = CreateCompilationWithMscorlib46(@"public interface C : A { }", new[] { aRef },
TestOptions.ReleaseDll.WithMetadataReferenceResolver(resolver));
c.VerifyDiagnostics(
......@@ -2766,16 +2766,16 @@ public void MissingAssemblyResolution_Multiple()
{
// c - a -> d
// - b -> d
var dRef = CreateStandardCompilation("public interface D { }", assemblyName: "D").EmitToImageReference();
var aRef = CreateStandardCompilation("public interface A : D { }", new[] { dRef }, assemblyName: "A").ToMetadataReference();
var bRef = CreateStandardCompilation("public interface B : D { }", new[] { dRef }, assemblyName: "B").ToMetadataReference();
var dRef = CreateCompilationWithMscorlib46("public interface D { }", assemblyName: "D").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46("public interface A : D { }", new[] { dRef }, assemblyName: "A").ToMetadataReference();
var bRef = CreateCompilationWithMscorlib46("public interface B : D { }", new[] { dRef }, assemblyName: "B").ToMetadataReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>
{
{ "D", dRef }
});
var c = CreateStandardCompilation("public interface C : A, B { }", new[] { aRef, bRef },
var c = CreateCompilationWithMscorlib46("public interface C : A, B { }", new[] { aRef, bRef },
TestOptions.ReleaseDll.WithMetadataReferenceResolver(resolver));
c.VerifyEmitDiagnostics();
......@@ -2793,13 +2793,13 @@ public void MissingAssemblyResolution_Modules()
// - module(m) - b
// - module(n) - d
var bRef = CreateStandardCompilation("public interface B { }", assemblyName: "B").EmitToImageReference();
var dRef = CreateStandardCompilation("public interface D { }", assemblyName: "D").EmitToImageReference();
var bRef = CreateCompilationWithMscorlib46("public interface B { }", assemblyName: "B").EmitToImageReference();
var dRef = CreateCompilationWithMscorlib46("public interface D { }", assemblyName: "D").EmitToImageReference();
var mRef = CreateStandardCompilation("public interface M : B { }", new[] { bRef }, options: TestOptions.ReleaseModule.WithModuleName("M.netmodule")).EmitToImageReference();
var nRef = CreateStandardCompilation("public interface N : D { }", new[] { dRef }, options: TestOptions.ReleaseModule.WithModuleName("N.netmodule")).EmitToImageReference();
var mRef = CreateCompilationWithMscorlib46("public interface M : B { }", new[] { bRef }, options: TestOptions.ReleaseModule.WithModuleName("M.netmodule")).EmitToImageReference();
var nRef = CreateCompilationWithMscorlib46("public interface N : D { }", new[] { dRef }, options: TestOptions.ReleaseModule.WithModuleName("N.netmodule")).EmitToImageReference();
var aRef = CreateStandardCompilation("public interface A : D { }", new[] { dRef }, assemblyName: "A").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46("public interface A : D { }", new[] { dRef }, assemblyName: "A").EmitToImageReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>
{
......@@ -2807,7 +2807,7 @@ public void MissingAssemblyResolution_Modules()
{ "D", dRef },
});
var c = CreateStandardCompilation("public interface C : A { }", new[] { aRef, mRef, nRef },
var c = CreateCompilationWithMscorlib46("public interface C : A { }", new[] { aRef, mRef, nRef },
TestOptions.ReleaseDll.WithMetadataReferenceResolver(resolver));
c.VerifyEmitDiagnostics();
......@@ -2830,11 +2830,11 @@ public void MissingAssemblyResolution_BindingToForExplicitReference1()
// c - a -> "b,v1"
// - "b,v3"
//
var b1Ref = CreateStandardCompilation(@"[assembly: System.Reflection.AssemblyVersion(""1.0.0.0"")] public class B { }", options: s_signedDll, assemblyName: "B").EmitToImageReference();
var b2Ref = CreateStandardCompilation(@"[assembly: System.Reflection.AssemblyVersion(""2.0.0.0"")] public class B { }", options: s_signedDll, assemblyName: "B").EmitToImageReference();
var b3Ref = CreateStandardCompilation(@"[assembly: System.Reflection.AssemblyVersion(""3.0.0.0"")] public class B { }", options: s_signedDll, assemblyName: "B").EmitToImageReference();
var b1Ref = CreateCompilationWithMscorlib46(@"[assembly: System.Reflection.AssemblyVersion(""1.0.0.0"")] public class B { }", options: s_signedDll, assemblyName: "B").EmitToImageReference();
var b2Ref = CreateCompilationWithMscorlib46(@"[assembly: System.Reflection.AssemblyVersion(""2.0.0.0"")] public class B { }", options: s_signedDll, assemblyName: "B").EmitToImageReference();
var b3Ref = CreateCompilationWithMscorlib46(@"[assembly: System.Reflection.AssemblyVersion(""3.0.0.0"")] public class B { }", options: s_signedDll, assemblyName: "B").EmitToImageReference();
var aRef = CreateStandardCompilation(@"[assembly: System.Reflection.AssemblyVersion(""1.0.0.0"")] public class A : B { }", new[] { b1Ref }, options: s_signedDll, assemblyName: "A").EmitToImageReference();
var aRef = CreateCompilationWithMscorlib46(@"[assembly: System.Reflection.AssemblyVersion(""1.0.0.0"")] public class A : B { }", new[] { b1Ref }, options: s_signedDll, assemblyName: "A").EmitToImageReference();
var resolver = new TestMissingMetadataReferenceResolver(new Dictionary<string, MetadataReference>
{
......@@ -2842,7 +2842,7 @@ public void MissingAssemblyResolution_BindingToForExplicitReference1()
{ "B, 1.0.0.0", b2Ref }
});
var c = CreateStandardCompilation("public class C : A { }", new[] { aRef, b3Ref },
var c = CreateCompilationWithMscorlib46("public class C : A { }", new[] { aRef, b3Ref },
s_signedDll.WithMetadataReferenceResolver(resolver));
c.VerifyEmitDiagnostics(
......
......@@ -4966,7 +4966,7 @@ static void Main()
}
";
var compilation = CreateStandardCompilation(source);
var compilation = CreateCompilationWithMscorlib46(source);
compilation.VerifyDiagnostics(
// (6,31): error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported
// (short X, string Y) = (Alice: 1, Bob: null);
......
......@@ -4766,7 +4766,7 @@ class C
genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters,
memberOptions: SymbolDisplayMemberOptions.IncludeType,
miscellaneousOptions: SymbolDisplayMiscellaneousOptions.UseSpecialTypes);
var comp = CreateStandardCompilation(text, references: new[] { SystemRuntimeFacadeRef, ValueTupleRef });
var comp = CreateCompilationWithMscorlib46(text, references: new[] { SystemRuntimeFacadeRef, ValueTupleRef });
comp.VerifyDiagnostics();
var symbol = comp.GetMember("C.f");
......
......@@ -1393,7 +1393,7 @@ public class C
}
}
";
var comp = CreateStandardCompilation(source, options: TestOptions.ReleaseDll, assemblyName: "comp");
var comp = CreateCompilationWithMscorlib46(source, options: TestOptions.ReleaseDll, assemblyName: "comp");
comp.VerifyDiagnostics();
CompileAndVerify(comp);
......@@ -1439,7 +1439,7 @@ public class C
}
}
";
var comp = CreateStandardCompilation(source, options: TestOptions.ReleaseDll, assemblyName: "comp");
var comp = CreateCompilationWithMscorlib46(source, options: TestOptions.ReleaseDll, assemblyName: "comp");
comp.VerifyDiagnostics();
var assemblies1 = MetadataTestHelpers.GetSymbolsForReferences(
......
......@@ -502,16 +502,16 @@ public class C
[CLSCompliant(false)]
public class Bad { }
";
var libCompliant = CreateStandardCompilation(libCompliant_cs).EmitToImageReference();
var compCompliant = CreateStandardCompilation(source, new[] { libCompliant }, TestOptions.ReleaseDll);
var libCompliant = CreateCompilationWithMscorlib46(libCompliant_cs).EmitToImageReference();
var compCompliant = CreateCompilationWithMscorlib46(source, new[] { libCompliant }, TestOptions.ReleaseDll);
compCompliant.VerifyDiagnostics(
// (8,23): warning CS3002: Return type of 'C.Method2()' is not CLS-compliant
// public (Bad, Bad) Method2() { throw new Exception(); }
Diagnostic(ErrorCode.WRN_CLS_BadReturnType, "Method2").WithArguments("C.Method2()").WithLocation(8, 23)
);
var libNotCompliant = CreateStandardCompilation(libNotCompliant_cs).EmitToImageReference();
var compNotCompliant = CreateStandardCompilation(source, new[] { libNotCompliant }, TestOptions.ReleaseDll);
var libNotCompliant = CreateCompilationWithMscorlib46(libNotCompliant_cs).EmitToImageReference();
var compNotCompliant = CreateCompilationWithMscorlib46(source, new[] { libNotCompliant }, TestOptions.ReleaseDll);
compNotCompliant.VerifyDiagnostics(
// (8,23): warning CS3002: Return type of 'C.Method2()' is not CLS-compliant
// public (Bad, Bad) Method2() { throw new Exception(); }
......
......@@ -276,7 +276,7 @@ class A
";
// CONSIDER: Roslyn's cascading errors are much uglier than Dev10's.
CreateStandardCompilation(source, parseOptions: TestOptions.Regular).VerifyDiagnostics(
CreateCompilationWithMscorlib46(source, parseOptions: TestOptions.Regular).VerifyDiagnostics(
// (4,11): error CS1031: Type expected
// const delegate void D();
Diagnostic(ErrorCode.ERR_TypeExpected, "delegate").WithLocation(4, 11),
......@@ -344,7 +344,7 @@ class A
";
// CONSIDER: Roslyn's cascading errors are much uglier than Dev10's.
CreateStandardCompilation(Parse(source, options: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp6))).VerifyDiagnostics(
CreateCompilationWithMscorlib46(source, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp6)).VerifyDiagnostics(
// (4,11): error CS1031: Type expected
// const delegate void D();
Diagnostic(ErrorCode.ERR_TypeExpected, "delegate").WithLocation(4, 11),
......
......@@ -1040,7 +1040,7 @@ class C
}";
// Triage decision was made to have this be a parse error as the grammar specifies it as such.
// TODO: vsadov, the error recovery would be much nicer here if we consumed "int", bu tneed to consider other cases.
CreateStandardCompilation(text, parseOptions: TestOptions.Regular).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text, parseOptions: TestOptions.Regular).VerifyDiagnostics(
// (5,11): error CS1001: Identifier expected
// int F<int>() { } // CS0081
Diagnostic(ErrorCode.ERR_IdentifierExpected, "int").WithLocation(5, 11),
......@@ -1091,7 +1091,7 @@ class C
}
}";
// Triage decision was made to have this be a parse error as the grammar specifies it as such.
CreateStandardCompilation(Parse(text, options: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp6))).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp6)).VerifyDiagnostics(
// (5,11): error CS1001: Identifier expected
// int F<int>() { } // CS0081
Diagnostic(ErrorCode.ERR_IdentifierExpected, "int").WithLocation(5, 11),
......@@ -4124,7 +4124,7 @@ static class S
internal static void E<T, U>(this object o) { }
}
";
CreateStandardCompilation(source, references: new[] { SystemCoreRef }).VerifyDiagnostics(
CreateCompilationWithMscorlib46(source).VerifyDiagnostics(
// (7,15): error CS0306: The type 'int*' may not be used as a type argument
// new C<int*>();
Diagnostic(ErrorCode.ERR_BadTypeArgument, "int*").WithArguments("int*"),
......@@ -4180,7 +4180,7 @@ static void M()
COfIntPtr.F<object>();
}
}";
CreateStandardCompilation(source).VerifyDiagnostics(
CreateCompilationWithMscorlib46(source).VerifyDiagnostics(
// (2,7): error CS0306: The type 'int*' may not be used as a type argument
Diagnostic(ErrorCode.ERR_BadTypeArgument, "COfIntPtr").WithArguments("int*").WithLocation(2, 7),
// (3,7): error CS0306: The type 'System.ArgIterator' may not be used as a type argument
......@@ -14430,7 +14430,7 @@ class C
}
}
";
CreateStandardCompilation(text).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text).VerifyDiagnostics(
// (5,5): error CS1599: Method or delegate cannot return type 'System.ArgIterator'
// ArgIterator M(); // 1599
Diagnostic(ErrorCode.ERR_MethodReturnCantBeRefAny, "ArgIterator").WithArguments("System.ArgIterator"),
......@@ -14475,7 +14475,7 @@ class MyClass
MyClass(ref RuntimeArgumentHandle r5) {} // CS1601
}
";
CreateStandardCompilation(text).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text).VerifyDiagnostics(
// (6,23): error CS1601: Cannot make reference to variable of type 'System.TypedReference'
// public void Test1(ref TypedReference t2, RuntimeArgumentHandle r3) // CS1601
Diagnostic(ErrorCode.ERR_MethodArgCantBeRefAny, "ref TypedReference t2").WithArguments("System.TypedReference"),
......
......@@ -2468,7 +2468,7 @@ public static void Main()
}
";
CreateStandardCompilation(text).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text).VerifyDiagnostics(
// (7,26): error CS8124: Tuple must contain at least two elements.
// var e = new ();
Diagnostic(ErrorCode.ERR_TupleTooFewElements, ")").WithLocation(7, 26),
......@@ -2534,7 +2534,7 @@ public static void Main()
}
}
";
CreateStandardCompilation(text, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp6)).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp6)).VerifyDiagnostics(
// (7,25): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7.0 or greater.
// var e = new ();
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "()").WithArguments("tuples", "7.0").WithLocation(7, 25),
......@@ -2566,7 +2566,7 @@ public static void Main()
}
}
";
CreateStandardCompilation(text, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp7)).VerifyDiagnostics(
CreateCompilationWithMscorlib46(text, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp7)).VerifyDiagnostics(
// (7,26): error CS8124: Tuple must contain at least two elements.
// var e = new ();
Diagnostic(ErrorCode.ERR_TupleTooFewElements, ")"),
......
......@@ -122,7 +122,7 @@ public static void Sample(bool b, string s)
}
static void M(string s) {}
}";
CreateStandardCompilation(test).VerifyDiagnostics(
CreateCompilationWithMscorlib46(test).VerifyDiagnostics(
// (7,17): error CS1525: Invalid expression term 'throw'
// s = s + throw new NullReferenceException();
Diagnostic(ErrorCode.ERR_InvalidExprTerm, "throw new NullReferenceException()").WithArguments("throw").WithLocation(7, 17),
......
......@@ -232,22 +232,22 @@ public static class NetStandard13
public static class NetStandard20
{
private static readonly Lazy<PortableExecutableReference> s_netstandard = new Lazy<PortableExecutableReference>(
() => AssemblyMetadata.CreateFromFile(Path.Combine(AppContext.BaseDirectory, "ref/netstandard.dll")).GetReference(display: "netstandard.dll (netstandard 2.0 ref)"),
() => AssemblyMetadata.CreateFromImage(TestResources.NetFX.netstandard20.netstandard).GetReference(display: "netstandard.dll (netstandard 2.0 ref)"),
LazyThreadSafetyMode.PublicationOnly);
public static PortableExecutableReference NetStandard => s_netstandard.Value;
private static readonly Lazy<PortableExecutableReference> s_mscorlib = new Lazy<PortableExecutableReference>(
() => AssemblyMetadata.CreateFromFile(Path.Combine(AppContext.BaseDirectory, "ref/mscorlib.dll")).GetReference(display: "mscorlib.dll (netstandard 2.0 ref)"),
() => AssemblyMetadata.CreateFromImage(TestResources.NetFX.netstandard20.mscorlib).GetReference(display: "mscorlib.dll (netstandard 2.0 ref)"),
LazyThreadSafetyMode.PublicationOnly);
public static PortableExecutableReference MscorlibRef => s_mscorlib.Value;
private static readonly Lazy<PortableExecutableReference> s_systemRuntime = new Lazy<PortableExecutableReference>(
() => AssemblyMetadata.CreateFromFile(Path.Combine(AppContext.BaseDirectory, "ref/System.Runtime.dll")).GetReference(display: "System.Runtime.dll (netstandard 2.0 ref)"),
() => AssemblyMetadata.CreateFromImage(TestResources.NetFX.netstandard20.System_Runtime).GetReference(display: "System.Runtime.dll (netstandard 2.0 ref)"),
LazyThreadSafetyMode.PublicationOnly);
public static PortableExecutableReference SystemRuntimeRef => s_systemRuntime.Value;
private static readonly Lazy<PortableExecutableReference> s_systemDynamicRuntime = new Lazy<PortableExecutableReference>(
() => AssemblyMetadata.CreateFromFile(Path.Combine(AppContext.BaseDirectory, "ref/System.Dynamic.Runtime.dll")).GetReference(display: "System.Dynamic.Runtime.dll (netstandard 2.0 ref)"),
() => AssemblyMetadata.CreateFromImage(TestResources.NetFX.netstandard20.System_Dynamic_Runtime).GetReference(display: "System.Dynamic.Runtime.dll (netstandard 2.0 ref)"),
LazyThreadSafetyMode.PublicationOnly);
public static PortableExecutableReference SystemDynamicRuntimeRef => s_systemDynamicRuntime.Value;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册