Skip to content

Commit 17e91c5

Browse files
committed
Address feedback
1 parent 8bca3da commit 17e91c5

File tree

5 files changed

+111
-48
lines changed

5 files changed

+111
-48
lines changed

src/Compilers/CSharp/Portable/Lowering/DiagnosticsPass_ExpressionTrees.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,9 @@ private void VisitCall(
340340
Error(ErrorCode.ERR_ExpressionTreeContainsNamedArgument, node);
341341
}
342342
else if (!argumentNamesOpt.IsDefaultOrEmpty &&
343-
_compilation.IsFeatureEnabled(MessageID.IDS_FeatureExpressionOptionalAndNamedArguments) &&
344343
hasNamedArgumentOutOfOrder(argsToParamsOpt))
345344
{
345+
Debug.Assert(_compilation.IsFeatureEnabled(MessageID.IDS_FeatureExpressionOptionalAndNamedArguments));
346346
Error(ErrorCode.ERR_ExpressionTreeContainsNamedArgumentOutOfPosition, node);
347347
}
348348
else if (IsComCallWithRefOmitted(method, arguments, argumentRefKindsOpt))

src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenExprLambdaTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,8 +2596,7 @@ static void Main()
25962596
}
25972597

25982598
[Theory]
2599-
[InlineData(LanguageVersion.CSharp13)]
2600-
[InlineData(LanguageVersionFacts.CSharpNext)]
2599+
[MemberData(nameof(LanguageVersions13AndNewer))]
26012600
public void MethodCallWithParams3(LanguageVersion languageVersion)
26022601
{
26032602
var text =
@@ -2614,7 +2613,7 @@ static void Main()
26142613
Console.WriteLine(testExpr);
26152614
}
26162615
}";
2617-
var comp = CreateCompilationWithMscorlib40AndSystemCore(text, parseOptions: TestOptions.Regular.WithLanguageVersion(languageVersion));
2616+
var comp = CreateCompilationWithMscorlib40AndSystemCore(text, parseOptions: TestOptions.Regular.WithLanguageVersion(languageVersion), options: TestOptions.ReleaseExe);
26182617
if (languageVersion == LanguageVersion.CSharp13)
26192618
{
26202619
comp.VerifyDiagnostics(
@@ -2625,7 +2624,8 @@ static void Main()
26252624
}
26262625
else
26272626
{
2628-
comp.VerifyDiagnostics();
2627+
var verifier = CompileAndVerify(comp, expectedOutput: "() => ModAdd2(3, 4, new [] {})");
2628+
verifier.VerifyDiagnostics();
26292629
}
26302630
}
26312631

src/Compilers/CSharp/Test/Emit3/Semantics/ExpressionOptionalAndNamedArgumentsTests.cs

Lines changed: 82 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,11 @@ public static T Run<T>(Func<T> f)
5050
[Theory]
5151
[CombinatorialData]
5252
public void OptionalParameter_01(
53-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
54-
bool useIn,
53+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
54+
[CombinatorialValues("", "in", "ref readonly")] string refKind,
5555
bool useExpression,
5656
bool useCompilationReference)
5757
{
58-
string refKind = useIn ? "in" : "";
5958
string sourceA = $$"""
6059
public static class A
6160
{
@@ -106,18 +105,27 @@ static void Main()
106105
null
107106
S
108107
""");
109-
verifier.VerifyDiagnostics();
108+
if (useCompilationReference && refKind == "ref readonly")
109+
{
110+
verifier.VerifyDiagnostics(
111+
// (3,52): warning CS9200: A default value is specified for 'ref readonly' parameter 't', but 'ref readonly' should be used only for references. Consider declaring the parameter as 'in'.
112+
// public static T GetValue<T>(ref readonly T t = default) => t;
113+
Diagnostic(ErrorCode.WRN_RefReadonlyParameterDefaultValue, "default").WithArguments("t").WithLocation(3, 52));
114+
}
115+
else
116+
{
117+
verifier.VerifyDiagnostics();
118+
}
110119
}
111120
}
112121

113122
[Theory]
114123
[CombinatorialData]
115124
public void OptionalParameter_02(
116-
bool useIn,
125+
[CombinatorialValues("", "in", "ref readonly")] string refKind,
117126
bool useExpression,
118127
bool useCompilationReference)
119128
{
120-
string refKind = useIn ? "in" : "";
121129
string sourceA = $$"""
122130
public static class A
123131
{
@@ -148,17 +156,32 @@ static void Main()
148156
default
149157
null
150158
""");
151-
verifier.VerifyDiagnostics();
159+
if (useCompilationReference && refKind == "ref readonly")
160+
{
161+
verifier.VerifyDiagnostics(
162+
// (3,56): warning CS9200: A default value is specified for 'ref readonly' parameter 'i', but 'ref readonly' should be used only for references. Consider declaring the parameter as 'in'.
163+
// public static int GetIntValue(ref readonly int i = 10) => i;
164+
Diagnostic(ErrorCode.WRN_RefReadonlyParameterDefaultValue, "10").WithArguments("i").WithLocation(3, 56),
165+
// (4,65): warning CS9200: A default value is specified for 'ref readonly' parameter 's', but 'ref readonly' should be used only for references. Consider declaring the parameter as 'in'.
166+
// public static string GetStringValue(ref readonly string s = "default") => s;
167+
Diagnostic(ErrorCode.WRN_RefReadonlyParameterDefaultValue, @"""default""").WithArguments("s").WithLocation(4, 65),
168+
// (5,65): warning CS9200: A default value is specified for 'ref readonly' parameter 'o', but 'ref readonly' should be used only for references. Consider declaring the parameter as 'in'.
169+
// public static object GetObjectValue(ref readonly object o = null) => o;
170+
Diagnostic(ErrorCode.WRN_RefReadonlyParameterDefaultValue, "null").WithArguments("o").WithLocation(5, 65));
171+
}
172+
else
173+
{
174+
verifier.VerifyDiagnostics();
175+
}
152176
}
153177

154178
[Theory]
155179
[CombinatorialData]
156180
public void OptionalParameter_AndParams(
157-
bool useIn,
181+
[CombinatorialValues("", "in", "ref readonly")] string refKind,
158182
bool useExpression,
159183
bool useCompilationReference)
160184
{
161-
string refKind = useIn ? "in" : "";
162185
string sourceA = $$"""
163186
public static class A
164187
{
@@ -188,13 +211,48 @@ static void Main()
188211
0
189212
3
190213
""");
191-
verifier.VerifyDiagnostics();
214+
if (refKind == "ref readonly")
215+
{
216+
if (useCompilationReference)
217+
{
218+
verifier.VerifyDiagnostics(
219+
// (3,70): warning CS9200: A default value is specified for 'ref readonly' parameter 'y', but 'ref readonly' should be used only for references. Consider declaring the parameter as 'in'.
220+
// public static T GetValue<T>(ref readonly T x, ref readonly T y = default, params T[] args) => y;
221+
Diagnostic(ErrorCode.WRN_RefReadonlyParameterDefaultValue, "default").WithArguments("y").WithLocation(3, 70),
222+
// (8,44): warning CS9193: Argument 1 should be a variable because it is passed to a 'ref readonly' parameter
223+
// Utils.Report(() => A.GetValue<int>(1));
224+
Diagnostic(ErrorCode.WRN_RefReadonlyNotVariable, "1").WithArguments("1").WithLocation(8, 44),
225+
// (9,44): warning CS9193: Argument 1 should be a variable because it is passed to a 'ref readonly' parameter
226+
// Utils.Report(() => A.GetValue<int>(2, 3, 4));
227+
Diagnostic(ErrorCode.WRN_RefReadonlyNotVariable, "2").WithArguments("1").WithLocation(9, 44),
228+
// (9,47): warning CS9193: Argument 2 should be a variable because it is passed to a 'ref readonly' parameter
229+
// Utils.Report(() => A.GetValue<int>(2, 3, 4));
230+
Diagnostic(ErrorCode.WRN_RefReadonlyNotVariable, "3").WithArguments("2").WithLocation(9, 47));
231+
}
232+
else
233+
{
234+
verifier.VerifyDiagnostics(
235+
// (8,44): warning CS9193: Argument 1 should be a variable because it is passed to a 'ref readonly' parameter
236+
// Utils.Report(() => A.GetValue<int>(1));
237+
Diagnostic(ErrorCode.WRN_RefReadonlyNotVariable, "1").WithArguments("1").WithLocation(8, 44),
238+
// (9,44): warning CS9193: Argument 1 should be a variable because it is passed to a 'ref readonly' parameter
239+
// Utils.Report(() => A.GetValue<int>(2, 3, 4));
240+
Diagnostic(ErrorCode.WRN_RefReadonlyNotVariable, "2").WithArguments("1").WithLocation(9, 44),
241+
// (9,47): warning CS9193: Argument 2 should be a variable because it is passed to a 'ref readonly' parameter
242+
// Utils.Report(() => A.GetValue<int>(2, 3, 4));
243+
Diagnostic(ErrorCode.WRN_RefReadonlyNotVariable, "3").WithArguments("2").WithLocation(9, 47));
244+
}
245+
}
246+
else
247+
{
248+
verifier.VerifyDiagnostics();
249+
}
192250
}
193251

194252
[Theory]
195253
[CombinatorialData]
196254
public void OptionalParameter_Constructor(
197-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
255+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
198256
bool useExpression)
199257
{
200258
string sourceA = $$"""
@@ -249,7 +307,7 @@ static void Main()
249307
[Theory]
250308
[CombinatorialData]
251309
public void OptionalParameter_Indexer(
252-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
310+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
253311
bool useExpression)
254312
{
255313
string sourceA = $$"""
@@ -299,7 +357,7 @@ static void Main()
299357
[Theory]
300358
[CombinatorialData]
301359
public void OptionalParameter_Delegate(
302-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
360+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
303361
bool useExpression)
304362
{
305363
string sourceA = $$"""
@@ -347,7 +405,7 @@ static void Main()
347405
[Theory]
348406
[CombinatorialData]
349407
public void OptionalParameter_CollectionInitializer(
350-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
408+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
351409
bool useExpression,
352410
bool useIn)
353411
{
@@ -411,7 +469,7 @@ static void Main()
411469
[Theory]
412470
[CombinatorialData]
413471
public void OptionalParameter_LocalFunction(
414-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion)
472+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion)
415473
{
416474
string source = """
417475
using System;
@@ -661,7 +719,7 @@ static void Main()
661719
[Theory]
662720
[CombinatorialData]
663721
public void NamedArgument_01(
664-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
722+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
665723
bool useExpression,
666724
bool useCompilationReference)
667725
{
@@ -780,7 +838,7 @@ static void Main()
780838
[Theory]
781839
[CombinatorialData]
782840
public void NamedArgument_02(
783-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
841+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
784842
bool useExpression,
785843
bool useCompilationReference)
786844
{
@@ -941,7 +999,7 @@ static void Main()
941999
[Theory]
9421000
[CombinatorialData]
9431001
public void NamedArgument_03(
944-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
1002+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
9451003
bool useExpression,
9461004
bool useCompilationReference)
9471005
{
@@ -1083,7 +1141,7 @@ static void Main()
10831141
[Theory]
10841142
[CombinatorialData]
10851143
public void NamedArgument_04(
1086-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
1144+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
10871145
bool useExpression,
10881146
bool useCompilationReference)
10891147
{
@@ -1312,7 +1370,7 @@ static void Main()
13121370
[Theory]
13131371
[CombinatorialData]
13141372
public void NamedArgument_OverloadsDifferentOrder(
1315-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
1373+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
13161374
bool useExpression,
13171375
bool useCompilationReference)
13181376
{
@@ -1485,7 +1543,7 @@ static void Main()
14851543
[Theory]
14861544
[CombinatorialData]
14871545
public void NamedArgument_Constructor(
1488-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
1546+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
14891547
bool useExpression)
14901548
{
14911549
string sourceA = $$"""
@@ -1587,7 +1645,7 @@ static void Main()
15871645
[Theory]
15881646
[CombinatorialData]
15891647
public void NamedArgument_Indexer(
1590-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
1648+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
15911649
bool useExpression)
15921650
{
15931651
string sourceA = $$"""
@@ -1695,7 +1753,7 @@ static void Main()
16951753
[Theory]
16961754
[CombinatorialData]
16971755
public void NamedArgument_Delegate(
1698-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
1756+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion,
16991757
bool useExpression)
17001758
{
17011759
string sourceA = $$"""
@@ -1791,7 +1849,7 @@ static void Main()
17911849
[Theory]
17921850
[CombinatorialData]
17931851
public void NamedArgument_LocalFunction(
1794-
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion)
1852+
[CombinatorialValues(LanguageVersion.CSharp13, LanguageVersion.Preview, LanguageVersionFacts.CSharpNext)] LanguageVersion languageVersion)
17951853
{
17961854
string source = """
17971855
using System;

0 commit comments

Comments
 (0)