{"id":809593,"url":"http://patchwork.ozlabs.org/api/patches/809593/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/CAG4ZjN=teuigpysiMSm+tE+3S4dm+WM=7n7A80gXBDFpdqfhBQ@mail.gmail.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<CAG4ZjN=teuigpysiMSm+tE+3S4dm+WM=7n7A80gXBDFpdqfhBQ@mail.gmail.com>","list_archive_url":null,"date":"2017-09-04T10:31:49","name":"[libstdc++/71500] make back reference work with icase","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"e9f95597ea943d3a1201765b19efa33d12844d45","submitter":{"id":70597,"url":"http://patchwork.ozlabs.org/api/people/70597/?format=json","name":"Li, Pan2 via Gcc-patches","email":"gcc-patches@gcc.gnu.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/CAG4ZjN=teuigpysiMSm+tE+3S4dm+WM=7n7A80gXBDFpdqfhBQ@mail.gmail.com/mbox/","series":[{"id":1352,"url":"http://patchwork.ozlabs.org/api/series/1352/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=1352","date":"2017-09-04T10:31:49","name":"[libstdc++/71500] make back reference work with icase","version":1,"mbox":"http://patchwork.ozlabs.org/series/1352/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/809593/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/809593/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-return-461396-incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":["patchwork-incoming@bilbo.ozlabs.org","mailing list gcc-patches@gcc.gnu.org"],"Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-461396-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"RoHSOJfP\"; dkim-atps=neutral","sourceware.org; auth=none"],"Received":["from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xm5kb466wz9sNc\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon,  4 Sep 2017 20:32:06 +1000 (AEST)","(qmail 98290 invoked by alias); 4 Sep 2017 10:31:58 -0000","(qmail 97603 invoked by uid 89); 4 Sep 2017 10:31:57 -0000","from mail-pg0-f51.google.com (HELO mail-pg0-f51.google.com)\n\t(74.125.83.51) by sourceware.org\n\t(qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP;\n\tMon, 04 Sep 2017 10:31:51 +0000","by mail-pg0-f51.google.com with SMTP id t3so314628pgt.0 for\n\t<gcc-patches@gcc.gnu.org>; Mon, 04 Sep 2017 03:31:51 -0700 (PDT)","by 10.100.189.77 with HTTP; Mon, 4 Sep 2017 03:31:49 -0700 (PDT)"],"DomainKey-Signature":"a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender\n\t:mime-version:from:reply-to:date:message-id:subject:to\n\t:content-type; q=dns; s=default; b=i9hM+iKnRAsKukQyntMsvhrZbU/8q\n\tHUt8PiA1+J0jH2LG4WwXj82NIFRRZeDbMfPBxpW8C0Y3qzm3jRj52lsGH0ORRAap\n\tNSmUqdvzmM+Od+VvKnP4dbym8SK7YGoaN7Oa4ni6Wfx5875LH/TZ/pihWO4RQ1LQ\n\ty9HYPQIPhdCKDU=","DKIM-Signature":"v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender\n\t:mime-version:from:reply-to:date:message-id:subject:to\n\t:content-type; s=default; bh=mpmo8ybbuIe1Fk0SS9YbnDwzQqo=; b=RoH\n\tSOJfP4lOaC336F+ntEcEy7ROz0y4iCHE6plLO079TgnXq+biHaF/MjUY0aMf1d0M\n\tekcHIDmaiKgL3xELwEto87g/mNqqNqnAiDA/FarJ/FwGJo2csZpWkF57edeaV/lw\n\tv5cEBoECSLTrSS3iWtX6OQbyH8m9hT12kP8Lw0Bc=","Mailing-List":"contact gcc-patches-help@gcc.gnu.org; run by ezmlm","Precedence":"bulk","List-Id":"<gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>","List-Archive":"<http://gcc.gnu.org/ml/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-help@gcc.gnu.org>","Sender":"gcc-patches-owner@gcc.gnu.org","X-Virus-Found":"No","X-Spam-SWARE-Status":"No, score=-26.4 required=5.0 tests=BAYES_00, GIT_PATCH_0,\n\tGIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE,\n\tRCVD_IN_SORBS_SPAM, RP_MATCHES_RCVD,\n\tSPF_PASS autolearn=ham version=3.3.2 spammy=","X-HELO":"mail-pg0-f51.google.com","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;\n\ts=20161025;\n\th=x-gm-message-state:mime-version:from:date:message-id:subject:to;\n\tbh=3vNCv9DqBsOYTm1BTLVTa0acl+fXx5Q5FqUEoaDDAjU=;\n\tb=h7Kfg8uhDUeQi0vg2lDSLu7s1tBTrTOK8SG4RRDfm2zf5sv22XgaFtIHrD3wIjJksr\n\tkyLCqhSc7iNNODpu4S1o/fwPT3JGUrPRjvm8LsAZcYRbAbtf8skb6v5sMqCVrAvbPbf/\n\t5ZICRllCzf3Hiy1VGSK8Rh1VoDr+80A7hPQrdMYFvTNMg1LI6q75dsbA+vOhSWpvDJgL\n\tpCTxnxvStMMJcNX447gpEggc4SXOdt76ddzt+jGndE8wIO8SS79d/aCxb3rPAP+H2YFE\n\t+jLBRtzi9YgDBRMSzYjoAQKjijaZmUFl6c3J64kAu/THHAVIAOeVgm7ycW7qGj+0FHue\n\tDOyQ==","X-Gm-Message-State":"AHPjjUjIdPwqQbBDnrG+jjSOGrqGi4xnIbPrVXGar/IZGxbrXJ3YOv7A\tNv+iQuRkFwCM2rj8bGMXXa+8YdqJ086B","X-Google-Smtp-Source":"ADKCNb6lwLlGgoyzMS91jkpubN/mr1JP2nphEwjY/zboLLdUBAGR1pDya8MSH2+raRii+21+bTd/SZnwxNqmpLjbNbs=","X-Received":"by 10.99.105.2 with SMTP id e2mr11533008pgc.410.1504521109759;\n\tMon, 04 Sep 2017 03:31:49 -0700 (PDT)","MIME-Version":"1.0","From":"\"Tim Shen via gcc-patches\" <gcc-patches@gcc.gnu.org>","Reply-To":"Tim Shen <timshen@google.com>","Date":"Mon, 4 Sep 2017 03:31:49 -0700","Message-ID":"<CAG4ZjN=teuigpysiMSm+tE+3S4dm+WM=7n7A80gXBDFpdqfhBQ@mail.gmail.com>","Subject":"[libstdc++/71500] make back reference work with icase","To":"\"libstdc++\" <libstdc++@gcc.gnu.org>,\n\tgcc-patches <gcc-patches@gcc.gnu.org>","Content-Type":"multipart/mixed; boundary=\"94eb2c13fcba4ee0df05585a9e7c\""},"content":"This fixes the follow-up comments in 71500.\n\nBack-reference matching is different from other matching, as the\ncontent the back-reference refers to is at \"run-time\", aka during\nregex_match(), not regex() compilation.\n\nFor compilation we do have an abstraction layer to catch all\ncomparison customizations, namely _M_translator in regex_compiler.h.\nUntil this patch, we don't have an abstraction for \"run-time\"\nmatching. I believe that back-reference is the only place that needs\nrun-time matching, so I just build a _Backref_matcher in\nregex_executot.tcc.\n\nTested on x86_64-linux-gnu.\n\nThanks!","diff":"commit a97b7fecd319e031ffc489a956b8cf3dc63eeb26\nAuthor: Tim Shen <timshen@google.com>\nDate:   Mon Sep 4 03:19:35 2017 -0700\n\n            PR libstdc++/71500\n            * include/bits/regex_executor.tcc: Support icase in\n            regex_tratis<...> for back reference matches.\n            * testsuite/28_regex/regression.cc: Test case.\n\ndiff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc\nindex 226e05856e1..f6149fecf9d 100644\n--- a/libstdc++-v3/include/bits/regex_executor.tcc\n+++ b/libstdc++-v3/include/bits/regex_executor.tcc\n@@ -335,6 +335,54 @@ namespace __detail\n \t  _M_states._M_queue(__state._M_next, _M_cur_results);\n     }\n \n+  template<typename _BiIter, typename _TraitsT>\n+    struct _Backref_matcher\n+    {\n+      _Backref_matcher(bool __icase, const _TraitsT& __traits)\n+      : _M_traits(__traits) { }\n+\n+      bool\n+      _M_apply(_BiIter __expected_begin,\n+\t       _BiIter __expected_end, _BiIter __actual_begin,\n+\t       _BiIter __actual_end)\n+      {\n+\treturn _M_traits.transform(__expected_begin, __expected_end)\n+\t    == _M_traits.transform(__actual_begin, __actual_end);\n+      }\n+\n+      const _TraitsT& _M_traits;\n+    };\n+\n+  template<typename _BiIter, typename _CharT>\n+    struct _Backref_matcher<_BiIter, std::regex_traits<_CharT>>\n+    {\n+      using _TraitsT = std::regex_traits<_CharT>;\n+      _Backref_matcher(bool __icase, const _TraitsT& __traits)\n+      : _M_icase(__icase), _M_traits(__traits) { }\n+\n+      bool\n+      _M_apply(_BiIter __expected_begin,\n+\t       _BiIter __expected_end, _BiIter __actual_begin,\n+\t       _BiIter __actual_end)\n+      {\n+\tif (!_M_icase)\n+\t  return std::equal(__expected_begin, __expected_end,\n+\t\t\t    __actual_begin, __actual_end);\n+\ttypedef std::ctype<_CharT> __ctype_type;\n+\tconst auto& __fctyp = use_facet<__ctype_type>(_M_traits.getloc());\n+\treturn std::equal(__expected_begin, __expected_end,\n+\t\t\t  __actual_begin, __actual_end,\n+\t\t\t  [this, &__fctyp](_CharT __lhs, _CharT __rhs)\n+\t\t\t  {\n+\t\t\t    return __fctyp.tolower(__lhs)\n+\t\t\t\t== __fctyp.tolower(__rhs);\n+\t\t\t  });\n+      }\n+\n+      bool _M_icase;\n+      const _TraitsT& _M_traits;\n+    };\n+\n   // First fetch the matched result from _M_cur_results as __submatch;\n   // then compare it with\n   // (_M_current, _M_current + (__submatch.second - __submatch.first)).\n@@ -355,9 +403,10 @@ namespace __detail\n \t   __last != _M_end && __tmp != __submatch.second;\n \t   ++__tmp)\n \t++__last;\n-      if (_M_re._M_automaton->_M_traits.transform(__submatch.first,\n-\t\t\t\t\t\t  __submatch.second)\n-\t  == _M_re._M_automaton->_M_traits.transform(_M_current, __last))\n+      if (_Backref_matcher<_BiIter, _TraitsT>(\n+\t      _M_re.flags() & regex_constants::icase,\n+\t      _M_re._M_automaton->_M_traits)._M_apply(\n+\t\t  __submatch.first, __submatch.second, _M_current, __last))\n \t{\n \t  if (__last != _M_current)\n \t    {\ndiff --git a/libstdc++-v3/testsuite/28_regex/regression.cc b/libstdc++-v3/testsuite/28_regex/regression.cc\nindex ee4d3e1e6f8..3fa9022eac4 100644\n--- a/libstdc++-v3/testsuite/28_regex/regression.cc\n+++ b/libstdc++-v3/testsuite/28_regex/regression.cc\n@@ -93,6 +93,17 @@ test06()\n   }\n }\n \n+// PR libstdc++/71500\n+void\n+test07()\n+{\n+  bool test [[gnu::unused]] = true;\n+\n+  VERIFY(regex_match_debug(\"abc abc\", regex(\"([a-z]+) \\\\1\", regex::icase)));\n+  VERIFY(regex_match_debug(\"Abc abc\", regex(\"([a-z]+) \\\\1\", regex::icase)));\n+  VERIFY(regex_match_debug(\"abc Abc\", regex(\"([a-z]+) \\\\1\", regex::icase)));\n+}\n+\n int\n main()\n {\n@@ -102,6 +113,7 @@ main()\n   test04();\n   test05();\n   test06();\n+  test07();\n   return 0;\n }\n \n","prefixes":["libstdc++/71500"]}