Skip to content

Commit c8acf2a

Browse files
authored
Use logical operator name to check for logical ternary operator (#14495)
1 parent 85543b5 commit c8acf2a

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

src/Compiler/Checking/CheckExpressions.fs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,15 +1015,16 @@ let MakeMemberDataAndMangledNameForMemberVal(g, tcref, isExtrinsic, attrs, implS
10151015

10161016
if not isCompGen && IsLogicalInfixOpName id.idText then
10171017
let m = id.idRange
1018-
let name = ConvertValLogicalNameToDisplayNameCore id.idText
1018+
let logicalName = id.idText
1019+
let displayName = ConvertValLogicalNameToDisplayNameCore logicalName
10191020
// Check symbolic members. Expect valSynData implied arity to be [[2]].
10201021
match SynInfo.AritiesOfArgs valSynData with
1021-
| [] | [0] -> warning(Error(FSComp.SR.memberOperatorDefinitionWithNoArguments name, m))
1022+
| [] | [0] -> warning(Error(FSComp.SR.memberOperatorDefinitionWithNoArguments displayName, m))
10221023
| n :: otherArgs ->
1023-
let opTakesThreeArgs = IsLogicalTernaryOperator name
1024-
if n<>2 && not opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonPairArgument(name, n), m))
1025-
if n<>3 && opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonTripleArgument(name, n), m))
1026-
if not (isNil otherArgs) then warning(Error(FSComp.SR.memberOperatorDefinitionWithCurriedArguments name, m))
1024+
let opTakesThreeArgs = IsLogicalTernaryOperator logicalName
1025+
if n<>2 && not opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonPairArgument(displayName, n), m))
1026+
if n<>3 && opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonTripleArgument(displayName, n), m))
1027+
if not (isNil otherArgs) then warning(Error(FSComp.SR.memberOperatorDefinitionWithCurriedArguments displayName, m))
10271028

10281029
if isExtrinsic && IsLogicalOpName id.idText then
10291030
warning(Error(FSComp.SR.tcMemberOperatorDefinitionInExtrinsic(), id.idRange))

tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173
<Compile Include="Language\CodeQuotationTests.fs" />
174174
<Compile Include="Language\InterpolatedStringsTests.fs" />
175175
<Compile Include="Language\ComputationExpressionTests.fs" />
176+
<Compile Include="Language\DynamicAssignmentOperatorTests.fs" />
176177
<Compile Include="Language\CastingTests.fs" />
177178
<Compile Include="Language\NameofTests.fs" />
178179
<Compile Include="Language\ExtensionMethodTests.fs" />
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
2+
3+
namespace FSharp.Compiler.ComponentTests.Language
4+
5+
open System
6+
open Xunit
7+
open FSharp.Test.Compiler
8+
9+
module DynamicAssignmentOperatorTests =
10+
11+
[<Theory>]
12+
[<InlineData("6.0")>]
13+
[<InlineData("7.0")>]
14+
let ``Implementing dynamic assignment operator does not produce a warning`` version =
15+
Fsx """
16+
type T = T with
17+
static member inline (?<-) (f, x, y) = f x y
18+
"""
19+
|> withLangVersion version
20+
|> compile
21+
|> shouldSucceed

0 commit comments

Comments
 (0)