From a350f3021506b31f1869d3aaacb1eea735d02f03 Mon Sep 17 00:00:00 2001 From: rosskuehl Date: Mon, 19 Dec 2022 21:49:56 -0500 Subject: [PATCH] use logical operator name to check for logical ternary operator --- src/Compiler/Checking/CheckExpressions.fs | 13 ++++++------ .../FSharp.Compiler.ComponentTests.fsproj | 1 + .../DynamicAssignmentOperatorTests.fs | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/Language/DynamicAssignmentOperatorTests.fs diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs index 54ec31a4451..86dbd0ee504 100644 --- a/src/Compiler/Checking/CheckExpressions.fs +++ b/src/Compiler/Checking/CheckExpressions.fs @@ -1015,15 +1015,16 @@ let MakeMemberDataAndMangledNameForMemberVal(g, tcref, isExtrinsic, attrs, implS if not isCompGen && IsLogicalInfixOpName id.idText then let m = id.idRange - let name = ConvertValLogicalNameToDisplayNameCore id.idText + let logicalName = id.idText + let displayName = ConvertValLogicalNameToDisplayNameCore logicalName // Check symbolic members. Expect valSynData implied arity to be [[2]]. match SynInfo.AritiesOfArgs valSynData with - | [] | [0] -> warning(Error(FSComp.SR.memberOperatorDefinitionWithNoArguments name, m)) + | [] | [0] -> warning(Error(FSComp.SR.memberOperatorDefinitionWithNoArguments displayName, m)) | n :: otherArgs -> - let opTakesThreeArgs = IsLogicalTernaryOperator name - if n<>2 && not opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonPairArgument(name, n), m)) - if n<>3 && opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonTripleArgument(name, n), m)) - if not (isNil otherArgs) then warning(Error(FSComp.SR.memberOperatorDefinitionWithCurriedArguments name, m)) + let opTakesThreeArgs = IsLogicalTernaryOperator logicalName + if n<>2 && not opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonPairArgument(displayName, n), m)) + if n<>3 && opTakesThreeArgs then warning(Error(FSComp.SR.memberOperatorDefinitionWithNonTripleArgument(displayName, n), m)) + if not (isNil otherArgs) then warning(Error(FSComp.SR.memberOperatorDefinitionWithCurriedArguments displayName, m)) if isExtrinsic && IsLogicalOpName id.idText then warning(Error(FSComp.SR.tcMemberOperatorDefinitionInExtrinsic(), id.idRange)) diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index 7627368cc57..1262a9dc28a 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -173,6 +173,7 @@ + diff --git a/tests/FSharp.Compiler.ComponentTests/Language/DynamicAssignmentOperatorTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/DynamicAssignmentOperatorTests.fs new file mode 100644 index 00000000000..69525f0ef38 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Language/DynamicAssignmentOperatorTests.fs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.ComponentTests.Language + +open System +open Xunit +open FSharp.Test.Compiler + +module DynamicAssignmentOperatorTests = + + [] + [] + [] + let ``Implementing dynamic assignment operator does not produce a warning`` version = + Fsx """ + type T = T with + static member inline (?<-) (f, x, y) = f x y + """ + |> withLangVersion version + |> compile + |> shouldSucceed \ No newline at end of file