[libcxx] r340609 - [libc++] Fix handling of negated character classes in regex

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 6 01:55:49 PDT 2018


Merged to 7.0 in r341529.

On Fri, Aug 24, 2018 at 4:10 PM, Louis Dionne via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: ldionne
> Date: Fri Aug 24 07:10:28 2018
> New Revision: 340609
>
> URL: http://llvm.org/viewvc/llvm-project?rev=340609&view=rev
> Log:
> [libc++] Fix handling of negated character classes in regex
>
> Summary:
> This commit fixes a regression introduced in r316095, where we don't match
> inverted character classes when there's no negated characrers in the []'s.
>
> rdar://problem/43060054
>
> Reviewers: mclow.lists, timshen, EricWF
>
> Subscribers: christof, dexonsmith, cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D50534
>
> Added:
>     libcxx/trunk/test/std/re/re.alg/re.alg.match/inverted_character_classes.pass.cpp
> Modified:
>     libcxx/trunk/include/regex
>     libcxx/trunk/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp
>
> Modified: libcxx/trunk/include/regex
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/regex?rev=340609&r1=340608&r2=340609&view=diff
> ==============================================================================
> --- libcxx/trunk/include/regex (original)
> +++ libcxx/trunk/include/regex Fri Aug 24 07:10:28 2018
> @@ -2414,20 +2414,17 @@ __bracket_expression<_CharT, _Traits>::_
>                  goto __exit;
>              }
>          }
> -        // set of "__found" chars =
> +        // When there's at least one of __neg_chars_ and __neg_mask_, the set
> +        // of "__found" chars is
>          //   union(complement(union(__neg_chars_, __neg_mask_)),
>          //         other cases...)
>          //
> -        // __neg_chars_ and __neg_mask_'d better be handled together, as there
> -        // are no short circuit opportunities.
> -        //
> -        // In addition, when __neg_mask_/__neg_chars_ is empty, they should be
> -        // treated as all ones/all chars.
> +        // It doesn't make sense to check this when there are no __neg_chars_
> +        // and no __neg_mask_.
> +        if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
>          {
> -          const bool __in_neg_mask = (__neg_mask_ == 0) ||
> -              __traits_.isctype(__ch, __neg_mask_);
> +            const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
>            const bool __in_neg_chars =
> -              __neg_chars_.empty() ||
>                std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
>                __neg_chars_.end();
>            if (!(__in_neg_mask || __in_neg_chars))
>
> Added: libcxx/trunk/test/std/re/re.alg/re.alg.match/inverted_character_classes.pass.cpp
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/re/re.alg/re.alg.match/inverted_character_classes.pass.cpp?rev=340609&view=auto
> ==============================================================================
> --- libcxx/trunk/test/std/re/re.alg/re.alg.match/inverted_character_classes.pass.cpp (added)
> +++ libcxx/trunk/test/std/re/re.alg/re.alg.match/inverted_character_classes.pass.cpp Fri Aug 24 07:10:28 2018
> @@ -0,0 +1,44 @@
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// <regex>
> +// UNSUPPORTED: c++98, c++03
> +
> +// Make sure that we correctly match inverted character classes.
> +
> +#include <cassert>
> +#include <regex>
> +
> +
> +int main() {
> +    assert(std::regex_match("X", std::regex("[X]")));
> +    assert(std::regex_match("X", std::regex("[XY]")));
> +    assert(!std::regex_match("X", std::regex("[^X]")));
> +    assert(!std::regex_match("X", std::regex("[^XY]")));
> +
> +    assert(std::regex_match("X", std::regex("[\\S]")));
> +    assert(!std::regex_match("X", std::regex("[^\\S]")));
> +
> +    assert(!std::regex_match("X", std::regex("[\\s]")));
> +    assert(std::regex_match("X", std::regex("[^\\s]")));
> +
> +    assert(std::regex_match("X", std::regex("[\\s\\S]")));
> +    assert(std::regex_match("X", std::regex("[^Y\\s]")));
> +    assert(!std::regex_match("X", std::regex("[^X\\s]")));
> +
> +    assert(std::regex_match("X", std::regex("[\\w]")));
> +    assert(std::regex_match("_", std::regex("[\\w]")));
> +    assert(!std::regex_match("X", std::regex("[^\\w]")));
> +    assert(!std::regex_match("_", std::regex("[^\\w]")));
> +
> +    assert(!std::regex_match("X", std::regex("[\\W]")));
> +    assert(!std::regex_match("_", std::regex("[\\W]")));
> +    assert(std::regex_match("X", std::regex("[^\\W]")));
> +    assert(std::regex_match("_", std::regex("[^\\W]")));
> +}
>
> Modified: libcxx/trunk/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp?rev=340609&r1=340608&r2=340609&view=diff
> ==============================================================================
> --- libcxx/trunk/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp (original)
> +++ libcxx/trunk/test/std/re/re.alg/re.alg.search/invert_neg_word_search.pass.cpp Fri Aug 24 07:10:28 2018
> @@ -18,7 +18,7 @@
>
>  #include <regex>
>  #include <cassert>
> -#include "test_macros.h"
> +
>
>  // PR34310
>  int main()
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list