Skip to content

Commit

Permalink
Fixes: dotnet#10891
Browse files Browse the repository at this point in the history
  • Loading branch information
VSadov committed Sep 28, 2016
1 parent 7b5e3d3 commit bc1ad9d
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 182 deletions.
6 changes: 6 additions & 0 deletions src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3181,6 +3181,12 @@ protected BoundExpression BindObjectCreationExpression(ObjectCreationExpressionS
{
var type = BindType(node.Type, diagnostics);

if (node.Type.Kind() == SyntaxKind.TupleType)
{
Error(diagnostics, ErrorCode.ERR_NewWithTupleTypeSyntax, node, type);
return BadExpression(node, LookupResultKind.NotCreatable);
}

BoundExpression boundInitializerOpt = node.Initializer == null ?
null :
BindInitializerExpressionOrValue(
Expand Down
3 changes: 3 additions & 0 deletions src/Compilers/CSharp/Portable/CSharpResources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -4932,6 +4932,9 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
<data name="ERR_PredefinedValueTupleTypeMustBeStruct" xml:space="preserve">
<value>Predefined type '{0}' must be a struct.</value>
</data>
<data name="ERR_NewWithTupleTypeSyntax" xml:space="preserve">
<value>"new" cannot be used with tuple type '{0}'. Use a tuple literal expression instead.</value>
</data>
<data name="ERR_DeconstructionVarFormDisallowsSpecificType" xml:space="preserve">
<value>Deconstruction 'var (...)' form disallows a specific type for 'var'.</value>
</data>
Expand Down
7 changes: 3 additions & 4 deletions src/Compilers/CSharp/Portable/Errors/ErrorCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1428,11 +1428,10 @@ internal enum ErrorCode

ERR_PredefinedValueTupleTypeNotFound = 8179,
ERR_SemiOrLBraceOrArrowExpected = 8180,
ERR_PredefinedValueTupleTypeMustBeStruct = 8180,
ERR_NewWithTupleTypeSyntax = 8181,
ERR_PredefinedValueTupleTypeMustBeStruct = 8182,

// Available = 8180-8195

// Available = 8181-8195
// Available = 8183-8195

#region diagnostics for out var
ERR_ImplicitlyTypedOutVariableUsedInTheSameArgumentList = 8196,
Expand Down
227 changes: 49 additions & 178 deletions src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -857,32 +857,16 @@ static void Main()
}
" + trivial2uple;

var comp = CompileAndVerify(source, expectedOutput: @"
{1, 2}
{0, 0}
");
comp.VerifyDiagnostics();
comp.VerifyIL("C.Main", @"
{
// Code size 54 (0x36)
.maxstack 3
.locals init (System.ValueTuple<int, int> V_0) //x
IL_0000: ldloca.s V_0
IL_0002: ldc.i4.1
IL_0003: ldc.i4.2
IL_0004: call ""System.ValueTuple<int, int>..ctor(int, int)""
IL_0009: ldloca.s V_0
IL_000b: constrained. ""System.ValueTuple<int, int>""
IL_0011: callvirt ""string object.ToString()""
IL_0016: call ""void System.Console.WriteLine(string)""
IL_001b: ldloca.s V_0
IL_001d: initobj ""System.ValueTuple<int, int>""
IL_0023: ldloca.s V_0
IL_0025: constrained. ""System.ValueTuple<int, int>""
IL_002b: callvirt ""string object.ToString()""
IL_0030: call ""void System.Console.WriteLine(string)""
IL_0035: ret
}");
var comp = CreateCompilationWithMscorlib(source);
comp.VerifyDiagnostics(
// (6,17): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// var x = new (int, int)(1, 2);
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int)(1, 2)").WithArguments("(int, int)").WithLocation(6, 17),
// (9,13): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// x = new (int, int)();
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int)()").WithArguments("(int, int)").WithLocation(9, 13)

);
}

[Fact]
Expand All @@ -900,63 +884,13 @@ static void Main()
}
" + trivial2uple;

var comp = CreateCompilationWithMscorlib45AndCSruntime(source, TestOptions.ReleaseExe);

var verifier = CompileAndVerify(comp, expectedOutput: @"
{1, 2}");
var comp = CreateCompilationWithMscorlib(source);
comp.VerifyDiagnostics(
// (7,17): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// var x = new (int, int)(1, arg);
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int)(1, arg)").WithArguments("(int, int)").WithLocation(7, 17)

verifier.VerifyIL("C.Main", @"
{
// Code size 129 (0x81)
.maxstack 7
.locals init (object V_0, //arg
System.ValueTuple<int, int> V_1) //x
IL_0000: ldc.i4.2
IL_0001: box ""int""
IL_0006: stloc.0
IL_0007: ldsfld ""System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>> C.<>o__0.<>p__0""
IL_000c: brtrue.s IL_004d
IL_000e: ldc.i4.0
IL_000f: ldtoken ""C""
IL_0014: call ""System.Type System.Type.GetTypeFromHandle(System.RuntimeTypeHandle)""
IL_0019: ldc.i4.3
IL_001a: newarr ""Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo""
IL_001f: dup
IL_0020: ldc.i4.0
IL_0021: ldc.i4.s 33
IL_0023: ldnull
IL_0024: call ""Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, string)""
IL_0029: stelem.ref
IL_002a: dup
IL_002b: ldc.i4.1
IL_002c: ldc.i4.3
IL_002d: ldnull
IL_002e: call ""Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, string)""
IL_0033: stelem.ref
IL_0034: dup
IL_0035: ldc.i4.2
IL_0036: ldc.i4.0
IL_0037: ldnull
IL_0038: call ""Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, string)""
IL_003d: stelem.ref
IL_003e: call ""System.Runtime.CompilerServices.CallSiteBinder Microsoft.CSharp.RuntimeBinder.Binder.InvokeConstructor(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags, System.Type, System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>)""
IL_0043: call ""System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>> System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>>.Create(System.Runtime.CompilerServices.CallSiteBinder)""
IL_0048: stsfld ""System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>> C.<>o__0.<>p__0""
IL_004d: ldsfld ""System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>> C.<>o__0.<>p__0""
IL_0052: ldfld ""System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)> System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>>.Target""
IL_0057: ldsfld ""System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>> C.<>o__0.<>p__0""
IL_005c: ldtoken ""System.ValueTuple<int, int>""
IL_0061: call ""System.Type System.Type.GetTypeFromHandle(System.RuntimeTypeHandle)""
IL_0066: ldc.i4.1
IL_0067: ldloc.0
IL_0068: callvirt ""(int, int) System.Func<System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic, (int, int)>.Invoke(System.Runtime.CompilerServices.CallSite, System.Type, int, dynamic)""
IL_006d: stloc.1
IL_006e: ldloca.s V_1
IL_0070: constrained. ""System.ValueTuple<int, int>""
IL_0076: callvirt ""string object.ToString()""
IL_007b: call ""void System.Console.WriteLine(string)""
IL_0080: ret
}");
);
}

[Fact]
Expand All @@ -982,81 +916,19 @@ static void Main()
}
" + trivial2uple;

var comp = CompileAndVerify(source, expectedOutput: @"
1
3
5
6
7");
comp.VerifyDiagnostics();
comp.VerifyIL("C.Main", @"
{
// Code size 184 (0xb8)
.maxstack 4
.locals init (System.ValueTuple<int, int> V_0, //x
System.ValueTuple<int, int> V_1, //x1
System.ValueTuple<int, (int b, int c)> V_2, //x2
System.ValueTuple<int, int> V_3,
System.ValueTuple<int, (int b, int c)> V_4)
IL_0000: ldloca.s V_0
IL_0002: ldc.i4.1
IL_0003: ldc.i4.2
IL_0004: call ""System.ValueTuple<int, int>..ctor(int, int)""
IL_0009: ldloca.s V_0
IL_000b: ldflda ""int System.ValueTuple<int, int>.Item1""
IL_0010: call ""string int.ToString()""
IL_0015: call ""void System.Console.WriteLine(string)""
IL_001a: ldloca.s V_3
IL_001c: ldc.i4.1
IL_001d: ldc.i4.2
IL_001e: call ""System.ValueTuple<int, int>..ctor(int, int)""
IL_0023: ldloca.s V_3
IL_0025: ldc.i4.3
IL_0026: stfld ""int System.ValueTuple<int, int>.Item1""
IL_002b: ldloca.s V_3
IL_002d: ldc.i4.4
IL_002e: stfld ""int System.ValueTuple<int, int>.Item2""
IL_0033: ldloc.3
IL_0034: stloc.1
IL_0035: ldloca.s V_1
IL_0037: ldflda ""int System.ValueTuple<int, int>.Item1""
IL_003c: call ""string int.ToString()""
IL_0041: call ""void System.Console.WriteLine(string)""
IL_0046: ldloca.s V_4
IL_0048: ldc.i4.1
IL_0049: ldc.i4.2
IL_004a: ldc.i4.3
IL_004b: newobj ""System.ValueTuple<int, int>..ctor(int, int)""
IL_0050: call ""System.ValueTuple<int, (int b, int c)>..ctor(int, (int b, int c))""
IL_0055: ldloca.s V_4
IL_0057: ldc.i4.5
IL_0058: stfld ""int System.ValueTuple<int, (int b, int c)>.Item1""
IL_005d: ldloca.s V_4
IL_005f: ldflda ""(int b, int c) System.ValueTuple<int, (int b, int c)>.Item2""
IL_0064: ldc.i4.6
IL_0065: stfld ""int System.ValueTuple<int, int>.Item1""
IL_006a: ldloca.s V_4
IL_006c: ldflda ""(int b, int c) System.ValueTuple<int, (int b, int c)>.Item2""
IL_0071: ldc.i4.7
IL_0072: stfld ""int System.ValueTuple<int, int>.Item2""
IL_0077: ldloc.s V_4
IL_0079: stloc.2
IL_007a: ldloca.s V_2
IL_007c: ldflda ""int System.ValueTuple<int, (int b, int c)>.Item1""
IL_0081: call ""string int.ToString()""
IL_0086: call ""void System.Console.WriteLine(string)""
IL_008b: ldloca.s V_2
IL_008d: ldflda ""(int b, int c) System.ValueTuple<int, (int b, int c)>.Item2""
IL_0092: ldflda ""int System.ValueTuple<int, int>.Item1""
IL_0097: call ""string int.ToString()""
IL_009c: call ""void System.Console.WriteLine(string)""
IL_00a1: ldloca.s V_2
IL_00a3: ldflda ""(int b, int c) System.ValueTuple<int, (int b, int c)>.Item2""
IL_00a8: ldflda ""int System.ValueTuple<int, int>.Item2""
IL_00ad: call ""string int.ToString()""
IL_00b2: call ""void System.Console.WriteLine(string)""
IL_00b7: ret
}");
var comp = CreateCompilationWithMscorlib(source);
comp.VerifyDiagnostics(
// (6,17): error CS8181: "new" cannot be used with tuple type '(int a, int b)'. Use a tuple literal expression instead.
// var x = new (int a, int b)(1, 2);
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int a, int b)(1, 2)").WithArguments("(int a, int b)").WithLocation(6, 17),
// (9,18): error CS8181: "new" cannot be used with tuple type '(int a, int b)'. Use a tuple literal expression instead.
// var x1 = new (int a, int b)(1, 2) { a = 3, Item2 = 4};
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int a, int b)(1, 2) { a = 3, Item2 = 4}").WithArguments("(int a, int b)").WithLocation(9, 18),
// (12,18): error CS8181: "new" cannot be used with tuple type '(int a, (int b, int c) d)'. Use a tuple literal expression instead.
// var x2 = new (int a, (int b, int c) d)(1, new (int, int)(2, 3)) { a = 5, d = {b = 6, c = 7}};
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int a, (int b, int c) d)(1, new (int, int)(2, 3)) { a = 5, d = {b = 6, c = 7}}").WithArguments("(int a, (int b, int c) d)").WithLocation(12, 18)

);
}

[WorkItem(10874, "https://github.com/dotnet/roslyn/issues/10874")]
Expand Down Expand Up @@ -1089,24 +961,22 @@ static void Main()

var comp = CreateCompilationWithMscorlib(source);
comp.VerifyDiagnostics(
// (6,22): error CS1729: '(int a, int b)' does not contain a constructor that takes 3 arguments
// (6,18): error CS8181: "new" cannot be used with tuple type '(int a, int b)'. Use a tuple literal expression instead.
// var x0 = new (int a, int b)(1, 2, 3);
Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(int a, int b)").WithArguments("(int a, int b)", "3").WithLocation(6, 22),
// (9,22): error CS1729: '(int, int)' does not contain a constructor that takes 3 arguments
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int a, int b)(1, 2, 3)").WithArguments("(int a, int b)").WithLocation(6, 18),
// (9,18): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// var x1 = new (int, int)(1, 2, 3);
Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(int, int)").WithArguments("(int, int)", "3").WithLocation(9, 22),
// (12,36): error CS1503: Argument 2: cannot convert from 'string' to 'int'
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int)(1, 2, 3)").WithArguments("(int, int)").WithLocation(9, 18),
// (12,18): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// var x2 = new (int, int)(1, "2");
Diagnostic(ErrorCode.ERR_BadArgType, @"""2""").WithArguments("2", "string", "int").WithLocation(12, 36),
// (15,22): error CS7036: There is no argument given that corresponds to the required formal parameter 'item2' of '(int, int).(int, int)'
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, @"new (int, int)(1, ""2"")").WithArguments("(int, int)").WithLocation(12, 18),
// (15,18): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// var x3 = new (int, int)(1);
Diagnostic(ErrorCode.ERR_NoCorrespondingArgument, "(int, int)").WithArguments("item2", "(int, int).(int, int)").WithLocation(15, 22),
// (18,40): error CS0117: '(int, int)' does not contain a definition for 'a'
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int)(1)").WithArguments("(int, int)").WithLocation(15, 18),
// (18,18): error CS8181: "new" cannot be used with tuple type '(int, int)'. Use a tuple literal expression instead.
// var x4 = new (int, int)(1, 1) {a = 1, Item3 = 2} ;
Diagnostic(ErrorCode.ERR_NoSuchMember, "a").WithArguments("(int, int)", "a").WithLocation(18, 40),
// (18,47): error CS0117: '(int, int)' does not contain a definition for 'Item3'
// var x4 = new (int, int)(1, 1) {a = 1, Item3 = 2} ;
Diagnostic(ErrorCode.ERR_NoSuchMember, "Item3").WithArguments("(int, int)", "Item3").WithLocation(18, 47)
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int)(1, 1) {a = 1, Item3 = 2}").WithArguments("(int, int)").WithLocation(18, 18)

);
}

Expand Down Expand Up @@ -11761,12 +11631,12 @@ public static explicit operator long((T1, T2) arg)

public static implicit operator (T1, T2)(System.Collections.Generic.KeyValuePair<T1, T2> arg)
{
return new (T1, T2)(arg.Key, arg.Value);
return (arg.Key, arg.Value);
}

public static explicit operator (T1, T2)(string arg)
{
return new (T1, T2)((T1)(object)arg, (T2)(object)arg);
return ((T1)(object)arg, (T2)(object)arg);
}


Expand Down Expand Up @@ -12409,12 +12279,12 @@ public static explicit operator long((T1, T2)? arg)

public static implicit operator (T1, T2)?(System.Collections.Generic.KeyValuePair<T1, T2> arg)
{
return new (T1, T2)(arg.Key, arg.Value);
return (arg.Key, arg.Value);
}

public static explicit operator (T1, T2)?(string arg)
{
return new (T1, T2)((T1)(object)arg, (T2)(object)arg);
return ((T1)(object)arg, (T2)(object)arg);
}


Expand Down Expand Up @@ -13634,12 +13504,13 @@ void M()

var comp = CreateCompilationWithMscorlib(source, references: new[] { ValueTupleRef, SystemRuntimeFacadeRef });
comp.VerifyDiagnostics(
// (6,83): error CS1503: Argument 8: cannot convert from 'int' to '(int)'
// (6,17): error CS8181: "new" cannot be used with tuple type '(int, int, int, int, int, int, int, int)'. Use a tuple literal expression instead.
// var x = new (int, int, int, int, int, int, int, int)(1, 2, 3, 4, 5, 6, 7, 8);
Diagnostic(ErrorCode.ERR_BadArgType, "8").WithArguments("8", "int", "(int)").WithLocation(6, 83),
// (7,21): error CS1729: '(int, int, int, int, int, int, int, int, int)' does not contain a constructor that takes 9 arguments
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int, int, int, int, int, int, int)(1, 2, 3, 4, 5, 6, 7, 8)").WithArguments("(int, int, int, int, int, int, int, int)").WithLocation(6, 17),
// (7,17): error CS8181: "new" cannot be used with tuple type '(int, int, int, int, int, int, int, int, int)'. Use a tuple literal expression instead.
// var y = new (int, int, int, int, int, int, int, int, int)(1, 2, 3, 4, 5, 6, 7, 8, 9);
Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(int, int, int, int, int, int, int, int, int)").WithArguments("(int, int, int, int, int, int, int, int, int)", "9").WithLocation(7, 21)
Diagnostic(ErrorCode.ERR_NewWithTupleTypeSyntax, "new (int, int, int, int, int, int, int, int, int)(1, 2, 3, 4, 5, 6, 7, 8, 9)").WithArguments("(int, int, int, int, int, int, int, int, int)").WithLocation(7, 17)

);
}

Expand Down

0 comments on commit bc1ad9d

Please sign in to comment.