Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disallow 'with' in expression trees #45095

Merged
merged 3 commits into from
Jun 15, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/Compilers/CSharp/Portable/CSharpResources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -5230,6 +5230,9 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
<data name="ERR_ExpressionTreeContainsThrowExpression" xml:space="preserve">
<value>An expression tree may not contain a throw-expression.</value>
</data>
<data name="ERR_ExpressionTreeContainsWithExpression" xml:space="preserve">
<value>An expression tree may not contain a with-expression.</value>
</data>
<data name="ERR_BadAssemblyName" xml:space="preserve">
<value>Invalid assembly name: {0}</value>
</data>
Expand Down
1 change: 1 addition & 0 deletions src/Compilers/CSharp/Portable/Errors/ErrorCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1818,6 +1818,7 @@ internal enum ErrorCode
ERR_CannotConvertAddressOfToDelegate = 8811,
ERR_AddressOfToNonFunctionPointer = 8812,

ERR_ExpressionTreeContainsWithExpression = 8849,
ERR_BadRecordDeclaration = 8850,
ERR_DuplicateRecordConstructor = 8851,
ERR_AssignmentInitOnly = 8852,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -860,5 +860,15 @@ public override BoundNode VisitThrowExpression(BoundThrowExpression node)

return base.VisitThrowExpression(node);
}

public override BoundNode VisitWithExpression(BoundWithExpression node)
{
if (_inExpressionLambda)
{
Error(ErrorCode.ERR_ExpressionTreeContainsWithExpression, node);
}

return base.VisitWithExpression(node);
}
}
}
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Strom výrazů nesmí obsahovat operátor řazené kolekce členů == nebo !=.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">{0}: Externí událost nemůže mít inicializátor.</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Eine Ausdrucksbaumstruktur darf keinen ==- oder !=-Tupeloperator enthalten.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">"{0}": Externes Ereignis darf keinen Initialisierer aufweisen.</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Un árbol de expresión no puede contener un operador de tupla == o !=.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">"{0}": un evento externo no puede tener un inicializador</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Une arborescence de l'expression ne peut pas contenir un opérateur de tuple == ou !=</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}' : un événement extern ne peut pas avoir d'initialiseur</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Un albero delle espressioni non può contenere un operatore == o != di tupla</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}': l'evento extern non può avere inizializzatori</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">式ツリーにタプルの == または != 演算子を含めることはできません</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}': extern イベントは初期化子を持つことができません</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">식 트리에는 튜플 == 또는 != 연산자를 사용할 수 없습니다.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}': extern 이벤트에는 이니셜라이저를 사용할 수 없습니다.</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Drzewo wyrażenia nie może zawierać operatora == ani != krotki.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'„{0}”: zdarzenie extern nie może mieć inicjatora</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.pt-BR.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Uma árvore de expressão não pode conter um operador == ou != de tupla</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}': o evento externo não pode ter inicializador</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.ru.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">Дерево выражений не может содержать оператор == или != кортежа.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">"{0}": внешнее событие не может иметь инициализатор</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.tr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">İfade ağacı, demetin == veya != işlecini içeremez.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}': dış etkinliğin başlatıcısı olamaz</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hans.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">表达式树不能包含元组 == 或 != 运算符</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">“{0}”: 外部事件不能有初始值设定项</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.zh-Hant.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@
<target state="translated">運算式樹狀架構不得包含元組 == 或 != 運算子。</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExpressionTreeContainsWithExpression">
<source>An expression tree may not contain a with-expression.</source>
<target state="new">An expression tree may not contain a with-expression.</target>
<note />
</trans-unit>
<trans-unit id="ERR_ExternEventInitializer">
<source>'{0}': extern event cannot have initializer</source>
<target state="translated">'{0}': 外部事件不可有初始設定式</target>
Expand Down
21 changes: 21 additions & 0 deletions src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,27 @@ record Point(int x, int y);
comp.VerifyDiagnostics();
}

[Fact]
public void TestInExpressionTree()
{
var source = @"
using System;
using System.Linq.Expressions;
public record C(int i)
{
public static void M()
{
Expression<Func<C, C>> expr = c => c with { i = 5 };
}
}";
var comp = CreateCompilation(source);
comp.VerifyDiagnostics(
// (8,44): error CS8849: An expression tree may not contain a with-expression.
// Expression<Func<C, C>> expr = c => c with { i = 5 };
Diagnostic(ErrorCode.ERR_ExpressionTreeContainsWithExpression, "c with { i = 5 }").WithLocation(8, 44)
);
}

[Fact]
public void RecordProperties_01()
{
Expand Down