未验证 提交 3c801953 编写于 作者: M msftbot[bot] 提交者: GitHub

Merge pull request #42011 from agocke/expression-tree-errors

Prohibit C# 8 index and range usage in expression trees
......@@ -6007,4 +6007,13 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
<data name="ERR_ImplicitRangeIndexerWithName" xml:space="preserve">
<value>Invocation of implicit Range Indexer cannot name the argument.</value>
</data>
<data name="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer" xml:space="preserve">
<value>An expression tree may not contain a pattern System.Index or System.Range indexer access</value>
</data>
<data name="ERR_ExpressionTreeContainsFromEndIndexExpression" xml:space="preserve">
<value>An expression tree may not contain a from-end index ('^') expression.</value>
</data>
<data name="ERR_ExpressionTreeContainsRangeExpression" xml:space="preserve">
<value>An expression tree may not contain a range ('..') expression.</value>
</data>
</root>
......@@ -1761,6 +1761,10 @@ internal enum ErrorCode
ERR_ConditionalOnLocalFunction = 8783,
ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer = 8790,
ERR_ExpressionTreeContainsFromEndIndexExpression = 8791,
ERR_ExpressionTreeContainsRangeExpression = 8792,
// Note: you will need to re-generate compiler code after adding warnings (eng\generate-compiler-code.cmd)
}
}
......@@ -79,6 +79,48 @@ public override BoundNode VisitArrayCreation(BoundArrayCreation node)
return base.VisitArrayCreation(node);
}
public override BoundNode VisitArrayAccess(BoundArrayAccess node)
{
if (_inExpressionLambda &&
node.Indices.Length == 1 &&
node.Indices[0].Type!.SpecialType == SpecialType.None)
{
Error(ErrorCode.ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer, node);
}
return base.VisitArrayAccess(node);
}
public override BoundNode VisitIndexOrRangePatternIndexerAccess(BoundIndexOrRangePatternIndexerAccess node)
{
if (_inExpressionLambda)
{
Error(ErrorCode.ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer, node);
}
return base.VisitIndexOrRangePatternIndexerAccess(node);
}
public override BoundNode VisitFromEndIndexExpression(BoundFromEndIndexExpression node)
{
if (_inExpressionLambda)
{
Error(ErrorCode.ERR_ExpressionTreeContainsFromEndIndexExpression, node);
}
return base.VisitFromEndIndexExpression(node);
}
public override BoundNode VisitRangeExpression(BoundRangeExpression node)
{
if (_inExpressionLambda)
{
Error(ErrorCode.ERR_ExpressionTreeContainsRangeExpression, node);
}
return base.VisitRangeExpression(node);
}
public override BoundNode VisitSizeOfOperator(BoundSizeOfOperator node)
{
if (_inExpressionLambda && node.ConstantValue == null)
......
......@@ -177,6 +177,21 @@
<target state="translated">Strom výrazu nemůže obsahovat hodnotu struktury REF ani zakázaný typ {0}.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Strom výrazů nesmí obsahovat výraz switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">Eine Ausdrucksstruktur darf keinen Wert vom Typ "ref struct" oder vom eingeschränkten Typ "{0}" enthalten.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Eine Ausdrucksstruktur darf keinen switch-Ausdruck enthalten.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">Un árbol de expresión no puede contener un valor de estructura ref ni el tipo restringido “{0}”.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Un árbol de expresión no puede contener una expresión switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">Une arborescence de l'expression ne peut pas contenir de valeur de struct par référence ou de type restreint '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Une arborescence de l'expression ne peut pas contenir d'expression switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">L'albero delle espressioni non può contenere il valore '{0}' per lo struct ref o il tipo limitato.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Un albero delle espressioni non può contenere un'espressione switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">式ツリーに ref 構造体または制限がある型 '{0}' の値を含めることはできません。</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">式ツリーに switch 式を含めることはできません。</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">식 트리에는 ref struct 값 또는 제한된 형식 '{0}'을(를) 사용할 수 없습니다.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">식 트리에는 switch 식이 포함될 수 없습니다.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">Drzewo wyrażeń nie może zawierać wartości elementu ref struct ani typu ograniczonego „{0}”.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Drzewo wyrażeń nie może zawierać wyrażenia switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">A árvore de expressão não pode conter um valor de struct de referência ou o tipo restrito '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Uma árvore de expressão não pode conter uma expressão switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">Дерево выражений не может содержать значение ref struct или ограниченный тип "{0}".</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">Дерево выражений не может содержать выражение switch.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">İfade ağacı, ref yapısında veya kısıtlanmış '{0}' türünde değer içeremez.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">İfade ağacı, switch ifadesi içeremez.</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">表达式树不能包含 ref 结构或受限类型“{0}”的值。</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">表达式树不能包含 switch 表达式。</target>
......
......@@ -177,6 +177,21 @@
<target state="translated">運算式樹狀架構不可包含 ref 結構或限制型別 '{0}' 的值。</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsFromEndIndexExpression">
<source>An expression tree may not contain a from-end index ('^') expression.</source>
<target state="new">An expression tree may not contain a from-end index ('^') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer">
<source>An expression tree may not contain a pattern System.Index or System.Range indexer access</source>
<target state="new">An expression tree may not contain a pattern System.Index or System.Range indexer access</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsRangeExpression">
<source>An expression tree may not contain a range ('..') expression.</source>
<target state="new">An expression tree may not contain a range ('..') expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsSwitchExpression">
<source>An expression tree may not contain a switch expression.</source>
<target state="translated">運算式樹狀結構不可包含 switch 運算式。</target>
......
......@@ -40,6 +40,76 @@ private static void VerifyIndexCall(IMethodSymbol symbol, string methodName, str
Assert.Equal(containingTypeName, symbol.ContainingType.Name);
}
[Fact]
public void ExpressionTreePatternIndexAndRange()
{
var src = @"
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
struct S
{
public int Length => 0;
public S Slice(int start, int length) => default;
}
class Program
{
static void Main()
{
Expression<Func<int[], int>> e = (int[] a) => a[new Index(0, true)]; // 1
Expression<Func<List<int>, int>> e2 = (List<int> a) => a[new Index(0, true)]; // 2
Expression<Func<int[], int[]>> e3 = (int[] a) => a[new Range(0, 1)]; // 3
Expression<Func<S, S>> e4 = (S s) => s[new Range(0, 1)]; // 4
}
}";
var comp = CreateCompilationWithIndexAndRange(
new[] { src, TestSources.GetSubArray, });
comp.VerifyEmitDiagnostics(
// (16,55): error CS8790: An expression tree may not contain a pattern System.Index or System.Range indexer access
// Expression<Func<int[], int>> e = (int[] a) => a[new Index(0, true)]; // 1
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer, "a[new Index(0, true)]").WithLocation(16, 55),
// (17,64): error CS8790: An expression tree may not contain a pattern System.Index or System.Range indexer access
// Expression<Func<List<int>, int>> e2 = (List<int> a) => a[new Index(0, true)]; // 2
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer, "a[new Index(0, true)]").WithLocation(17, 64),
// (19,58): error CS8790: An expression tree may not contain a pattern System.Index or System.Range indexer access
// Expression<Func<int[], int[]>> e3 = (int[] a) => a[new Range(0, 1)]; // 3
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer, "a[new Range(0, 1)]").WithLocation(19, 58),
// (20,46): error CS8790: An expression tree may not contain a pattern System.Index or System.Range indexer access
// Expression<Func<S, S>> e4 = (S s) => s[new Range(0, 1)]; // 4
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsPatternIndexOrRangeIndexer, "s[new Range(0, 1)]").WithLocation(20, 46)
);
}
[Fact]
public void ExpressionTreeFromEndIndexAndRange()
{
var src = @"
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
class Program
{
static void Main()
{
Expression<Func<Index>> e = () => ^1;
Expression<Func<Range>> e2 = () => 1..2;
}
}";
var comp = CreateCompilationWithIndexAndRange(src);
comp.VerifyEmitDiagnostics(
// (10,43): error CS8791: An expression tree may not contain a from-end index ('^') expression.
// Expression<Func<Index>> e = () => ^1;
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsFromEndIndexExpression, "^1").WithLocation(10, 43),
// (11,44): error CS8792: An expression tree may not contain a range ('..') expression.
// Expression<Func<Range>> e2 = () => 1..2;
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsRangeExpression, "1..2").WithLocation(11, 44)
);
}
[Fact]
public void PatternIndexArray()
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册