@@ -517,10 +517,36 @@ extension RegexTests {
517517
518518 parseTest (
519519 " [a-b-c] " , charClass ( range_m ( " a " , " b " ) , " - " , " c " ) )
520+ parseTest (
521+ " [a-b-c-d] " , charClass ( range_m ( " a " , " b " ) , " - " , range_m ( " c " , " d " ) ) )
522+
523+ parseTest ( " [a-c---] " , charClass (
524+ setOp ( range_m ( " a " , " c " ) , op: . subtraction, " - " )
525+ ) )
526+
527+ parseTest ( " (?x)[a-c -- -] " , concat (
528+ changeMatchingOptions ( matchingOptions ( adding: . extended) ) ,
529+ charClass ( setOp ( range_m ( " a " , " c " ) , op: . subtraction, " - " ) )
530+ ) )
531+
532+ parseTest ( " (?x)[a-c - - -] " , concat (
533+ changeMatchingOptions ( matchingOptions ( adding: . extended) ) ,
534+ charClass ( range_m ( " a " , " c " ) , range_m ( " - " , " - " ) )
535+ ) )
520536
521537 parseTest ( " [-a-] " , charClass ( " - " , " a " , " - " ) )
522538 parseTest ( " [[a]-] " , charClass ( charClass ( " a " ) , " - " ) )
523- parseTest ( " [[a]-b] " , charClass ( charClass ( " a " ) , " - " , " b " ) )
539+ parseTest ( " [-[a]] " , charClass ( " - " , charClass ( " a " ) ) )
540+
541+ parseTest ( #"(?x)[ -[b]]"# , concat (
542+ changeMatchingOptions ( matchingOptions ( adding: . extended) ) ,
543+ charClass ( " - " , charClass ( " b " ) )
544+ ) )
545+
546+ parseTest ( #"[ - [ ]]"# , charClass ( range_m ( " " , " " ) , charClass ( " " ) ) )
547+ parseTest ( #"[ - [ ] ]"# , charClass ( range_m ( " " , " " ) , charClass ( " " ) , " " ) )
548+
549+ parseTest ( #"[a-c-\Qd\E]"# , charClass ( range_m ( " a " , " c " ) , " - " , quote_m ( " d " ) ) )
524550
525551 parseTest ( " [a-z] " , charClass ( range_m ( " a " , " z " ) ) )
526552 parseTest ( " [a-a] " , charClass ( range_m ( " a " , " a " ) ) )
@@ -2692,6 +2718,32 @@ extension RegexTests {
26922718 diagnosticTest ( " [[:=:]] " , . emptyProperty)
26932719
26942720 diagnosticTest ( #"|([\d-c])?"# , . invalidCharacterClassRangeOperand)
2721+ diagnosticTest ( " [[a]-b] " , . invalidCharacterClassRangeOperand)
2722+
2723+ // .NET subtraction is banned, we require explicit '--'.
2724+ diagnosticTest ( " [a-[b]] " , . unsupportedDotNetSubtraction)
2725+ diagnosticTest ( #"[abc-[def]]"# , . unsupportedDotNetSubtraction)
2726+ diagnosticTest ( #"[abc-[^def]]"# , . unsupportedDotNetSubtraction)
2727+ diagnosticTest ( #"[\d\u{0}[a]-[b-[c]]]"# , . unsupportedDotNetSubtraction)
2728+ diagnosticTest ( " [a-z-[d-w-[m-o]]] " , . unsupportedDotNetSubtraction)
2729+ diagnosticTest ( #"[a-[:b]]"# , . unsupportedDotNetSubtraction)
2730+ diagnosticTest ( #"[[a]-[b]]"# , . invalidCharacterClassRangeOperand)
2731+ diagnosticTest ( #"[ -[ ]]"# , . unsupportedDotNetSubtraction)
2732+ diagnosticTest ( #"(?x)[a - [b] ]"# , . unsupportedDotNetSubtraction)
2733+
2734+ diagnosticTest ( #"[a-[]]"# , . expectedCustomCharacterClassMembers)
2735+ diagnosticTest ( #"[-[]]"# , . expectedCustomCharacterClassMembers)
2736+ diagnosticTest ( #"(?x)[ - [ ] ]"# , . expectedCustomCharacterClassMembers)
2737+ diagnosticTest ( #"(?x)[a-[ ] ]"# , . expectedCustomCharacterClassMembers)
2738+ diagnosticTest ( #"[a-[:digit:]]"# , . invalidCharacterClassRangeOperand)
2739+
2740+ diagnosticTest ( " [--] " , . expectedCustomCharacterClassMembers)
2741+ diagnosticTest ( " [---] " , . expectedCustomCharacterClassMembers)
2742+ diagnosticTest ( " [----] " , . expectedCustomCharacterClassMembers)
2743+
2744+ // Quoted sequences aren't currently supported as range operands.
2745+ diagnosticTest ( #"[a-\Qbc\E]"# , . unsupported( " range with quoted sequence " ) )
2746+ diagnosticTest ( #"[\Qbc\E-de]"# , . unsupported( " range with quoted sequence " ) )
26952747
26962748 diagnosticTest ( #"[_-A]"# , . invalidCharacterRange( from: " _ " , to: " A " ) )
26972749 diagnosticTest ( #"(?i)[_-A]"# , . invalidCharacterRange( from: " _ " , to: " A " ) )
@@ -2878,6 +2930,17 @@ extension RegexTests {
28782930 /#
28792931 """# , . quoteMayNotSpanMultipleLines)
28802932
2933+ // .NET subtraction
2934+ diagnosticWithDelimitersTest ( #"""
2935+ #/
2936+ [
2937+ a # interesting
2938+ - #a
2939+ [ b] # comment
2940+ ]
2941+ /#
2942+ """# , . unsupportedDotNetSubtraction)
2943+
28812944 // MARK: Group specifiers
28822945
28832946 diagnosticTest ( #"(*"# , . unknownGroupKind( " * " ) )
0 commit comments