diff --git a/src/Compilers/CSharp/Portable/Binder/Imports.cs b/src/Compilers/CSharp/Portable/Binder/Imports.cs index 634af41e9dc0643b8bb5568529a488fcb234032f..57c89d8a6ec385f59b876971e6a5842648b3bfaa 100644 --- a/src/Compilers/CSharp/Portable/Binder/Imports.cs +++ b/src/Compilers/CSharp/Portable/Binder/Imports.cs @@ -578,7 +578,6 @@ private void Validate() var corLibrary = _compilation.SourceAssembly.CorLibrary; var conversions = new TypeConversions(corLibrary); - bool includeNullability = _compilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); foreach (var @using in Usings) { // Check if `using static` directives meet constraints. @@ -586,7 +585,7 @@ private void Validate() { var typeSymbol = (TypeSymbol)@using.NamespaceOrType; var location = @using.UsingDirective?.Name.Location ?? NoLocation.Singleton; - typeSymbol.CheckAllConstraints(_compilation, conversions, includeNullability, location, semanticDiagnostics); + typeSymbol.CheckAllConstraints(_compilation, conversions, location, semanticDiagnostics); } } diff --git a/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs b/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs index 93e676b23b0a2a9c7bbffd32282945b3c634d050..1b03860e62807ca82f5764318f506eafb07c484c 100644 --- a/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs +++ b/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs @@ -3189,7 +3189,7 @@ internal EffectiveParameters(ImmutableArray types, Im var parameterTypes = leastOverriddenMember.GetParameterTypes(); for (int i = 0; i < parameterTypes.Length; i++) { - if (!parameterTypes[i].TypeSymbol.CheckAllConstraints(Compilation, Conversions, Conversions.IncludeNullability)) + if (!parameterTypes[i].TypeSymbol.CheckAllConstraints(Compilation, Conversions)) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.ConstructedParameterFailedConstraintsCheck(i)); } diff --git a/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolutionResult.cs b/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolutionResult.cs index 90c194a02b1b5ed1f0d1fb5cc70cb336ef4c6526..193bf2501eedf94b95f545f91f7a0ee11802ab2e 100644 --- a/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolutionResult.cs +++ b/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolutionResult.cs @@ -974,7 +974,7 @@ private void ReportDuplicateNamedArgument(MemberResolutionResult result // formal parameter type. TypeSymbol formalParameterType = method.ParameterTypes[result.Result.BadParameter].TypeSymbol; - formalParameterType.CheckAllConstraints((CSharpCompilation)compilation, conversions.IncludeNullability, conversions, location, diagnostics); + formalParameterType.CheckAllConstraints((CSharpCompilation)compilation, conversions, conversions.IncludeNullability, location, diagnostics); return true; } diff --git a/src/Compilers/CSharp/Portable/Symbols/AliasSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/AliasSymbol.cs index a3e9fc7f7438aac412b026df49e42a269b1864be..19b03ea560613f0698de90504cf78d2d72db98d9 100644 --- a/src/Compilers/CSharp/Portable/Symbols/AliasSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/AliasSymbol.cs @@ -304,8 +304,7 @@ internal void CheckConstraints(DiagnosticBag diagnostics) { var corLibrary = this.ContainingAssembly.CorLibrary; var conversions = new TypeConversions(corLibrary); - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); - target.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, _locations[0], diagnostics); + target.CheckAllConstraints(DeclaringCompilation, conversions, _locations[0], diagnostics); } } diff --git a/src/Compilers/CSharp/Portable/Symbols/ConstraintsHelper.cs b/src/Compilers/CSharp/Portable/Symbols/ConstraintsHelper.cs index 16f52c1a4804a445630f25e12135fbcc7192f8b5..cd74718dd07aacdc4e91058fcb51ba9048ef2493 100644 --- a/src/Compilers/CSharp/Portable/Symbols/ConstraintsHelper.cs +++ b/src/Compilers/CSharp/Portable/Symbols/ConstraintsHelper.cs @@ -459,26 +459,39 @@ internal static class ConstraintsHelper this TypeSymbol type, CSharpCompilation compilation, ConversionsBase conversions, - bool includeNullability, Location location, DiagnosticBag diagnostics) { - type.VisitType(s_checkConstraintsSingleTypeFunc, new CheckConstraintsArgs(compilation, conversions, includeNullability, location, diagnostics)); + bool includeNullability = compilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); + CheckAllConstraints(type, compilation, conversions, includeNullability, location, diagnostics); } public static bool CheckAllConstraints( this TypeSymbol type, CSharpCompilation compilation, - ConversionsBase conversions, - bool includeNullability) + ConversionsBase conversions) { var diagnostics = DiagnosticBag.GetInstance(); - type.CheckAllConstraints(compilation, conversions, includeNullability, NoLocation.Singleton, diagnostics); + + // Nullability checks can only add warnings here so skip them for this check as we are only + // concerned with errors. + CheckAllConstraints(type, compilation, conversions, includeNullability: false, NoLocation.Singleton, diagnostics); bool ok = !diagnostics.HasAnyErrors(); diagnostics.Free(); return ok; } + public static void CheckAllConstraints( + this TypeSymbol type, + CSharpCompilation compilation, + ConversionsBase conversions, + bool includeNullability, + Location location, + DiagnosticBag diagnostics) + { + type.VisitType(s_checkConstraintsSingleTypeFunc, new CheckConstraintsArgs(compilation, conversions, includeNullability, location, diagnostics)); + } + private readonly struct CheckConstraintsArgs { public readonly CSharpCompilation CurrentCompilation; diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceCustomEventSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceCustomEventSymbol.cs index 37ffe8642729b75bc346950d8461c2a00ed69d3f..6394e2b1716e2b9973a24e40aed8e52e892dda2b 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceCustomEventSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceCustomEventSymbol.cs @@ -183,7 +183,7 @@ internal override void AfterAddingTypeMembersChecks(ConversionsBase conversions, { var explicitInterfaceSpecifier = this.ExplicitInterfaceSpecifier; Debug.Assert(explicitInterfaceSpecifier != null); - _explicitInterfaceType.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, new SourceLocation(explicitInterfaceSpecifier.Name), diagnostics); + _explicitInterfaceType.CheckAllConstraints(DeclaringCompilation, conversions, new SourceLocation(explicitInterfaceSpecifier.Name), diagnostics); } if (!_explicitInterfaceImplementations.IsEmpty) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs index b6f2169e49b60c2942f7bb2bf427264e3583c4d0..39b22ef182500093034446a8a22ab20ef065729f 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceEventSymbol.cs @@ -671,7 +671,7 @@ internal override void AfterAddingTypeMembersChecks(ConversionsBase conversions, bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); this.CheckModifiersAndType(diagnostics); - this.Type.CheckAllConstraints(DeclaringCompilation, conversions, includeNullablity, location, diagnostics); + this.Type.CheckAllConstraints(DeclaringCompilation, conversions, location, diagnostics); if (this.Type.NeedsNullableAttribute()) { diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs index a8d52a6f22b6b22a75075b9191bc40b05e57777a..cedb40fb085a5cd2c28ede99208245c8a6ac6bc1 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberFieldSymbol.cs @@ -575,8 +575,7 @@ internal override bool IsDefinedInSourceTree(SyntaxTree tree, TextSpan? definedW internal override void AfterAddingTypeMembersChecks(ConversionsBase conversions, DiagnosticBag diagnostics) { var options = (CSharpParseOptions)SyntaxTree.Options; - bool includeNullability = options.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); - Type.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, ErrorLocation, diagnostics); + Type.CheckAllConstraints(DeclaringCompilation, conversions, ErrorLocation, diagnostics); base.AfterAddingTypeMembersChecks(conversions, diagnostics); } } diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs index 8606d3f5e9d0bab6ba8c3a005e91f6dd45b65c1d..215022264b2237844c277bfd7b379ef512348404 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs @@ -106,8 +106,7 @@ protected override void CheckBase(DiagnosticBag diagnostics) var corLibrary = this.ContainingAssembly.CorLibrary; var conversions = new TypeConversions(corLibrary); var location = singleDeclaration.NameLocation; - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); - localBase.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, location, diagnostics); + localBase.CheckAllConstraints(DeclaringCompilation, conversions, location, diagnostics); } } @@ -132,7 +131,6 @@ protected override void CheckInterfaces(DiagnosticBag diagnostics) var corLibrary = this.ContainingAssembly.CorLibrary; var conversions = new TypeConversions(corLibrary); var location = singleDeclaration.NameLocation; - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); foreach (var pair in interfaces) { @@ -140,11 +138,7 @@ protected override void CheckInterfaces(DiagnosticBag diagnostics) foreach (var @interface in set) { -<<<<<<< HEAD @interface.CheckAllConstraints(DeclaringCompilation, conversions, location, diagnostics); -======= - @interface.CheckAllConstraints(conversions, includeNullability, location, diagnostics); ->>>>>>> Make nullability explicit constraint parameter } if (set.Count > 1) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceOrdinaryMethodSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceOrdinaryMethodSymbol.cs index cd46a3d84a22a040e64b8714233a2fd8fa943cae..8be06acf4ac08e35c88731fc92bdb74cfa177702 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceOrdinaryMethodSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceOrdinaryMethodSymbol.cs @@ -1010,7 +1010,6 @@ internal override void ForceComplete(SourceLocation locationOpt, CancellationTok internal override void AfterAddingTypeMembersChecks(ConversionsBase conversions, DiagnosticBag diagnostics) { var location = GetSyntax().ReturnType.Location; - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); Debug.Assert(location != null); @@ -1022,14 +1021,14 @@ internal override void AfterAddingTypeMembersChecks(ConversionsBase conversions, { var syntax = this.GetSyntax(); Debug.Assert(syntax.ExplicitInterfaceSpecifier != null); - _explicitInterfaceType.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, new SourceLocation(syntax.ExplicitInterfaceSpecifier.Name), diagnostics); + _explicitInterfaceType.CheckAllConstraints(DeclaringCompilation, conversions, new SourceLocation(syntax.ExplicitInterfaceSpecifier.Name), diagnostics); } - this.ReturnType.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, this.Locations[0], diagnostics); + this.ReturnType.CheckAllConstraints(DeclaringCompilation, conversions, this.Locations[0], diagnostics); foreach (var parameter in this.Parameters) { - parameter.Type.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, parameter.Locations[0], diagnostics); + parameter.Type.CheckAllConstraints(DeclaringCompilation, conversions, parameter.Locations[0], diagnostics); } var implementingPart = this.SourcePartialImplementation; diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourcePropertySymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourcePropertySymbol.cs index edf0349d76c0e0120e08126301de7dff88776f00..12c5785e773769981abeb45bc6ecec88344e0514 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourcePropertySymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourcePropertySymbol.cs @@ -742,9 +742,8 @@ internal override void AfterAddingTypeMembersChecks(ConversionsBase conversions, if ((object)_explicitInterfaceType != null) { var explicitInterfaceSpecifier = GetExplicitInterfaceSpecifier(this.CSharpSyntaxNode); - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); Debug.Assert(explicitInterfaceSpecifier != null); - _explicitInterfaceType.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, new SourceLocation(explicitInterfaceSpecifier.Name), diagnostics); + _explicitInterfaceType.CheckAllConstraints(DeclaringCompilation, conversions, new SourceLocation(explicitInterfaceSpecifier.Name), diagnostics); // Note: we delayed nullable-related checks that could pull on NonNullTypes PropertySymbol overriddenOrImplementedProperty = null; @@ -1380,11 +1379,10 @@ internal override void ForceComplete(SourceLocation locationOpt, CancellationTok { var diagnostics = DiagnosticBag.GetInstance(); var conversions = new TypeConversions(this.ContainingAssembly.CorLibrary); - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); foreach (var parameter in this.Parameters) { parameter.ForceComplete(locationOpt, cancellationToken); - parameter.Type.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, parameter.Locations[0], diagnostics); + parameter.Type.CheckAllConstraints(DeclaringCompilation, conversions, parameter.Locations[0], diagnostics); } this.AddDeclarationDiagnostics(diagnostics); @@ -1411,7 +1409,7 @@ internal override void ForceComplete(SourceLocation locationOpt, CancellationTok var diagnostics = DiagnosticBag.GetInstance(); var conversions = new TypeConversions(this.ContainingAssembly.CorLibrary); bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); - this.Type.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, _location, diagnostics); + this.Type.CheckAllConstraints(DeclaringCompilation, conversions, _location, diagnostics); var type = this.Type.TypeSymbol; if (type.IsRestrictedType(ignoreSpanLikeTypes: true)) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceTypeParameterSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceTypeParameterSymbol.cs index 3cb18fcab8401dd5dfa207eb6a8390490c70aee2..6b7f6b660d51614bf04e57589d98ba06393c9f98 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceTypeParameterSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceTypeParameterSymbol.cs @@ -261,7 +261,6 @@ private void CheckConstraintTypeConstraints(DiagnosticBag diagnostics) var corLibrary = this.ContainingAssembly.CorLibrary; var conversions = new TypeConversions(corLibrary); - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); var location = _locations[0]; foreach (var constraintType in constraintTypes) @@ -271,7 +270,7 @@ private void CheckConstraintTypeConstraints(DiagnosticBag diagnostics) if (!diagnostics.Add(location, useSiteDiagnostics)) { - constraintType.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, location, diagnostics); + constraintType.CheckAllConstraints(DeclaringCompilation, conversions, location, diagnostics); } } } diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceUserDefinedOperatorSymbolBase.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceUserDefinedOperatorSymbolBase.cs index d56441f73a7f4269023dc651917b829efc07f411..fc775d1be35ee19dd8adeeb1a11264d2b3aaa87d 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceUserDefinedOperatorSymbolBase.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceUserDefinedOperatorSymbolBase.cs @@ -644,12 +644,11 @@ internal sealed override void AfterAddingTypeMembersChecks(ConversionsBase conve // method name location for any such errors. We'll do the same for return // type errors but for parameter errors, we'll use the parameter location. - bool includeNullability = DeclaringCompilation.IsFeatureEnabled(MessageID.IDS_FeatureNullableReferenceTypes); - this.ReturnType.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, this.Locations[0], diagnostics); + this.ReturnType.CheckAllConstraints(DeclaringCompilation, conversions, this.Locations[0], diagnostics); foreach (var parameter in this.Parameters) { - parameter.Type.CheckAllConstraints(DeclaringCompilation, conversions, includeNullability, parameter.Locations[0], diagnostics); + parameter.Type.CheckAllConstraints(DeclaringCompilation, conversions, parameter.Locations[0], diagnostics); } ParameterHelpers.EnsureIsReadOnlyAttributeExists(Parameters, diagnostics, modifyCompilation: true); diff --git a/src/Compilers/CSharp/Portable/Symbols/TypeParameterSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/TypeParameterSymbol.cs index ac97c9072e25ede26e0d61e37c1899bf19eb6bb2..fc1aaa064529b8165f22b3b1daae4df8f5f08c9b 100644 --- a/src/Compilers/CSharp/Portable/Symbols/TypeParameterSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/TypeParameterSymbol.cs @@ -584,7 +584,7 @@ internal bool GetIsValueType(ConsList inProgress) } public sealed override bool IsValueType => GetIsValueType(ConsList.Empty); - + internal sealed override ManagedKind ManagedKind { get diff --git a/src/Compilers/CSharp/Portable/Symbols/TypeSymbolWithAnnotations.cs b/src/Compilers/CSharp/Portable/Symbols/TypeSymbolWithAnnotations.cs index f90d4fc32f129d8ef96d913bc4ee61d31685dc98..427fd9304b4a49e5e8c9eb8eb133668bba1f11d9 100644 --- a/src/Compilers/CSharp/Portable/Symbols/TypeSymbolWithAnnotations.cs +++ b/src/Compilers/CSharp/Portable/Symbols/TypeSymbolWithAnnotations.cs @@ -730,9 +730,9 @@ public bool GetUnificationUseSiteDiagnosticRecursive(ref DiagnosticInfo result, Symbol.GetUnificationUseSiteDiagnosticRecursive(ref result, this.CustomModifiers, owner, ref checkedTypes); } - public void CheckAllConstraints(CSharpCompilation compilation, ConversionsBase conversions, bool includeNullability, Location location, DiagnosticBag diagnostics) + public void CheckAllConstraints(CSharpCompilation compilation, ConversionsBase conversions, Location location, DiagnosticBag diagnostics) { - TypeSymbol.CheckAllConstraints(compilation, conversions, includeNullability, location, diagnostics); + TypeSymbol.CheckAllConstraints(compilation, conversions, location, diagnostics); } public bool IsAtLeastAsVisibleAs(Symbol sym, ref HashSet useSiteDiagnostics) diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs index a96fcd78fee46f96fad58689acf55360b3a0d122..2e4d03af44b388faaf47ce7684c1ae5cd3519787 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs @@ -57031,10 +57031,7 @@ class B4 : A comp.VerifyDiagnostics( // (11,20): warning CS8632: The annotation for nullable reference types should only be used in code within a '#nullable' context. // class B2 : A - Diagnostic(ErrorCode.WRN_MissingNonNullTypesContextForAnnotation, "?").WithLocation(11, 20), - // (27,7): warning CS8634: The type 'string?' cannot be used as type parameter 'T' in the generic type or method 'A'. Nullability of type argument 'string?' doesn't match 'class' constraint. - // class B4 : A - Diagnostic(ErrorCode.WRN_NullabilityMismatchInTypeParameterReferenceTypeConstraint, "B4").WithArguments("A", "T", "string?").WithLocation(27, 7) + Diagnostic(ErrorCode.WRN_MissingNonNullTypesContextForAnnotation, "?").WithLocation(11, 20) ); verifyAllConstraintTypes(); @@ -57063,7 +57060,10 @@ class B4 : A comp.VerifyDiagnostics( // (11,20): warning CS8632: The annotation for nullable reference types should only be used in code within a '#nullable' context. // class B2 : A - Diagnostic(ErrorCode.WRN_MissingNonNullTypesContextForAnnotation, "?").WithLocation(11, 20) + Diagnostic(ErrorCode.WRN_MissingNonNullTypesContextForAnnotation, "?").WithLocation(11, 20), + // (27,7): warning CS8634: The type 'string?' cannot be used as type parameter 'T' in the generic type or method 'A'. Nullability of type argument 'string?' doesn't match 'class' constraint. + // class B4 : A + Diagnostic(ErrorCode.WRN_NullabilityMismatchInTypeParameterReferenceTypeConstraint, "B4").WithArguments("A", "T", "string?").WithLocation(27, 7) ); verifyAllConstraintTypes();