[{"id":3669338,"web_url":"http://patchwork.ozlabs.org/comment/3669338/","msgid":"<61dd8ddd-21d5-4da0-9949-08acf979e116@redhat.com>","list_archive_url":null,"date":"2026-03-25T21:33:33","subject":"Re: [PATCH v2] c++/reflection: ICE with substitute and undeduced auto\n [PR123613]","submitter":{"id":4337,"url":"http://patchwork.ozlabs.org/api/people/4337/","name":"Jason Merrill","email":"jason@redhat.com"},"content":"On 3/24/26 7:53 PM, Marek Polacek wrote:\n> On Fri, Mar 20, 2026 at 06:19:18PM -0400, Jason Merrill wrote:\n>> On 3/19/26 2:01 PM, Marek Polacek wrote:\n>>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?\n>>>\n>>> -- >8 --\n>>> In substitute7.C we have\n>>>\n>>>     template <typename T, auto ... Vs>\n>>>     constexpr auto construct_from = T{Vs...}; // #1\n>>>     struct Inner {};\n>>>     struct Outer { Inner m; };\n>>>     constexpr auto r = substitute(^^construct_from,\n>>>                                  { ^^Outer, ^^construct_from<Inner> });\n>>>\n>>> which crashes because the auto in #1 hadn't been deduced when we\n>>> called eval_can_substitute -> lookup_template_variable when processing\n>>> the substitute call.\n>>\n>> Hmm, why wasn't it already deduced when we took the reflection? Likewise for\n>> the resolve_, actually.\n> \n> It seems like I can do the instantiation earlier, in get_reflection.  We\n> already perform the resolve_ there, so eval_can_substitute probably does\n> not need to do it again.\n>   \n> Thus, v2:\n> \n> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?\n\nOK.\n\n> -- >8 --\n> In substitute7.C we have\n> \n>    template <typename T, auto ... Vs>\n>    constexpr auto construct_from = T{Vs...}; // #1\n>    struct Inner {};\n>    struct Outer { Inner m; };\n>    constexpr auto r = substitute(^^construct_from,\n>                                 { ^^Outer, ^^construct_from<Inner> });\n> \n> which crashes because the auto in #1 hadn't been deduced when we\n> called eval_can_substitute -> lookup_template_variable when processing\n> the substitute call.  We can call mark_used to resolve this, because\n> it has:\n> \n>    if (undeduced_auto_decl (decl))\n>      maybe_instantiate_decl (decl);\n> \n> and to make the json-parser.C test work, we have to do something\n> similar in eval_substitute, otherwise we crash due to another\n> undeduced auto.\n> \n> \tPR c++/123613\n> \n> gcc/cp/ChangeLog:\n> \n> \t* reflect.cc (get_reflection): Call mark_used.\n> \t(eval_can_substitute): Don't resolve_nondeduced_context here.\n> \t(eval_substitute): Call lookup_and_finish_template_variable instead\n> \tof lookup_template_variable and finish_template_variable.\n> \n> gcc/testsuite/ChangeLog:\n> \n> \t* g++.dg/reflect/json-parser.C: New test.\n> \t* g++.dg/reflect/substitute7.C: New test.\n> \t* g++.dg/reflect/test.json: New test.\n> ---\n>   gcc/cp/reflect.cc                          |  16 +-\n>   gcc/testsuite/g++.dg/reflect/json-parser.C | 161 +++++++++++++++++++++\n>   gcc/testsuite/g++.dg/reflect/substitute7.C |  14 ++\n>   gcc/testsuite/g++.dg/reflect/test.json     |   4 +\n>   4 files changed, 188 insertions(+), 7 deletions(-)\n>   create mode 100644 gcc/testsuite/g++.dg/reflect/json-parser.C\n>   create mode 100644 gcc/testsuite/g++.dg/reflect/substitute7.C\n>   create mode 100644 gcc/testsuite/g++.dg/reflect/test.json\n> \n> diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc\n> index 0b1d3a36f37..e4313ae5e98 100644\n> --- a/gcc/cp/reflect.cc\n> +++ b/gcc/cp/reflect.cc\n> @@ -212,8 +212,14 @@ get_reflection (location_t loc, tree t, reflect_kind kind/*=REFLECT_UNDEF*/)\n>        overload resolution for the expression &S with no target shall\n>        select a unique function; R represents that function.  */\n>     else if (!processing_template_decl && t != unknown_type_node)\n> -    /* Resolve all TEMPLATE_ID_EXPRs here.  */\n> -    t = resolve_nondeduced_context_or_error (t, tf_warning_or_error);\n> +    {\n> +      /* Resolve all TEMPLATE_ID_EXPRs here.  */\n> +      t = resolve_nondeduced_context_or_error (t, tf_warning_or_error);\n> +      /* The argument could have a deduced return type, so we need to\n> +\t instantiate it now to find out its type.  */\n> +      if (!mark_used (t))\n> +\treturn error_mark_node;\n> +    }\n>   \n>     /* For injected-class-name, use the main variant so that comparing\n>        reflections works (cf. compare3.C).  */\n> @@ -5359,7 +5365,6 @@ eval_can_substitute (location_t loc, const constexpr_ctx *ctx,\n>   \treturn throw_exception (loc, ctx,\n>   \t\t\t\t\"invalid argument to can_substitute\",\n>   \t\t\t\tfun, non_constant_p, jump_target);\n> -      a = resolve_nondeduced_context (a, tf_warning_or_error);\n>         a = convert_from_reference (a);\n>         TREE_VEC_ELT (rvec, i) = a;\n>       }\n> @@ -5432,10 +5437,7 @@ eval_substitute (location_t loc, const constexpr_ctx *ctx,\n>         return get_reflection_raw (loc, ret, REFLECT_VALUE);\n>       }\n>     else if (variable_template_p (r))\n> -    {\n> -      ret = lookup_template_variable (r, rvec, tf_none);\n> -      ret = finish_template_variable (ret, tf_none);\n> -    }\n> +    ret = lookup_and_finish_template_variable (r, rvec, tf_none);\n>     else\n>       {\n>         if (DECL_FUNCTION_TEMPLATE_P (r))\n> diff --git a/gcc/testsuite/g++.dg/reflect/json-parser.C b/gcc/testsuite/g++.dg/reflect/json-parser.C\n> new file mode 100644\n> index 00000000000..6c54bb51704\n> --- /dev/null\n> +++ b/gcc/testsuite/g++.dg/reflect/json-parser.C\n> @@ -0,0 +1,161 @@\n> +// PR c++/123613\n> +// { dg-do compile { target c++26 } }\n> +// { dg-additional-options \"-freflection\" }\n> +\n> +#include <meta>\n> +#include <charconv>\n> +#include <string>\n> +#include <algorithm>\n> +\n> +template <std::meta::info ...Ms>\n> +struct Outer {\n> +    struct Inner;\n> +    consteval {\n> +        define_aggregate(^^Inner, {Ms...});\n> +    }\n> +};\n> +\n> +template <std::meta::info ...Ms>\n> +using Cls = Outer<Ms...>::Inner;\n> +\n> +template <typename T, auto ... Vs>\n> +constexpr auto construct_from = T{Vs...};\n> +\n> +consteval std::meta::info parse_json(std::string_view json) {\n> +  auto cursor = json.begin();\n> +  auto end = json.end();\n> +\n> +  auto is_whitespace = [](char c) {\n> +    return c == ' ' || c == '\\n' || c == '\\t';\n> +  };\n> +\n> +  auto skip_whitespace = [&] -> void {\n> +    while (is_whitespace(*cursor)) cursor++;\n> +  };\n> +\n> +  auto expect_consume = [&] (char c) -> void {\n> +    skip_whitespace();\n> +    if (cursor == end || *(cursor++) != c) throw \"unexpected character\";\n> +  };\n> +\n> +  auto parse_until = [&](std::vector<char> delims, std::string &out) -> void {\n> +    skip_whitespace();\n> +    while (cursor != end &&\n> +           !std::ranges::any_of(delims, [&](char c) { return c == *cursor; }))\n> +      out += *(cursor++);\n> +  };\n> +\n> +  auto parse_delimited = [&](char lhs, std::string &out, char rhs) -> void {\n> +    skip_whitespace();\n> +    expect_consume(lhs);\n> +    parse_until({rhs}, out);\n> +    expect_consume(rhs);\n> +  };\n> +\n> +  auto parse_value = [&](std::string &out) -> void {\n> +    skip_whitespace();\n> +\n> +    bool quoted = false;\n> +    unsigned depth = 0;\n> +    while (true) {\n> +      if (cursor == end) throw \"unexpected end of stream\";\n> +      if (is_whitespace(*cursor) && !quoted && depth == 0)\n> +        break;\n> +\n> +      if (depth == 0 && (*cursor == ',' || *cursor == '}'))\n> +        break;\n> +      out += *(cursor++);\n> +\n> +      if (out.back() == '{')\n> +        ++depth;\n> +      else if (out.back() == '}')\n> +        --depth;\n> +      else if (out.back() == '\"') {\n> +        if (quoted && depth == 0)\n> +          break;\n> +        quoted = true;\n> +      }\n> +    };\n> +  };\n> +\n> +  skip_whitespace();\n> +  expect_consume('{');\n> +\n> +  std::vector<std::meta::info> members;\n> +  std::vector<std::meta::info> values = {^^void};\n> +\n> +  using std::meta::reflect_constant, std::meta::reflect_constant_string;\n> +  while (cursor != end && *cursor != '}') {\n> +    std::string field_name;\n> +    std::string value;\n> +\n> +    std::meta::info parsed_type;\n> +\n> +    parse_delimited('\"', field_name, '\"');\n> +    expect_consume(':');\n> +    parse_value(value);\n> +\n> +    if (value.empty()) throw \"expected value\";\n> +    if (cursor == end) throw \"unexpected end of stream\";\n> +\n> +    if (value[0] == '\"') {\n> +      if (value.back() == '}' && value[1] == 'f') throw \"hmm\";\n> +      if (value.back() != '\"') throw \"expected end of string\";\n> +      std::string_view contents(&value[1], value.size() - 2);\n> +\n> +      auto dms = data_member_spec(^^char const*, {.name=field_name});\n> +      members.push_back(reflect_constant(dms));\n> +      values.push_back(reflect_constant_string(contents));\n> +    } else if (value[0] >= '0' && value[0] <= '9') {\n> +      int contents = [](std::string_view in) {\n> +        int out;\n> +        std::from_chars(in.data(), in.data() + in.size(), out);\n> +        return out;\n> +      }(value);\n> +\n> +      auto dms = data_member_spec(^^int, {.name=field_name});\n> +      members.push_back(reflect_constant(dms));\n> +      values.push_back(reflect_constant(contents));\n> +    } else if (value[0] == '{') {\n> +      std::meta::info parsed = parse_json(value);\n> +\n> +      auto dms = data_member_spec(type_of(parsed), {.name=field_name});\n> +      members.push_back(reflect_constant(dms));\n> +      values.push_back(parsed);\n> +    }\n> +    skip_whitespace();\n> +    if (cursor != end && *cursor == ',')\n> +      ++cursor;\n> +  }\n> +  if (cursor == end) throw \"hmm\";\n> +  expect_consume('}');\n> +\n> +  values[0] = substitute(^^Cls, members);\n> +  return substitute(^^construct_from, values);\n> +}\n> +\n> +struct JSONString {\n> +    std::meta::info Rep;\n> +    consteval JSONString(const char *Json) : Rep{parse_json(Json)} {}\n> +};\n> +\n> +template <JSONString json>\n> +consteval auto operator\"\"_json() {\n> +    return [:json.Rep:];\n> +}\n> +\n> +template <JSONString json>\n> +inline constexpr auto json_to_object = [: json.Rep :];\n> +\n> +constexpr const char data[] = {\n> +    #embed \"test.json\"\n> +    , 0\n> +};\n> +\n> +int main() {\n> +  constexpr auto v = json_to_object<data>;\n> +  static_assert(std::string_view(v.outer) == \"text\");\n> +  static_assert(v.inner.number == 2996);\n> +  static_assert(std::string_view(v.inner.field) == \"yes\");\n> +  static_assert(R\"({\"field\": \"yes\", \"number\": 2996})\"_json.number == 2996);\n> +}\n> diff --git a/gcc/testsuite/g++.dg/reflect/substitute7.C b/gcc/testsuite/g++.dg/reflect/substitute7.C\n> new file mode 100644\n> index 00000000000..15bacd09371\n> --- /dev/null\n> +++ b/gcc/testsuite/g++.dg/reflect/substitute7.C\n> @@ -0,0 +1,14 @@\n> +// PR c++/123613\n> +// { dg-do compile { target c++26 } }\n> +// { dg-additional-options \"-freflection\" }\n> +\n> +#include <meta>\n> +\n> +template <typename T, auto ... Vs>\n> +constexpr auto construct_from = T{Vs...};\n> +\n> +struct Inner {};\n> +struct Outer { Inner m; };\n> +\n> +constexpr auto r = substitute(^^construct_from,\n> +                             { ^^Outer, ^^construct_from<Inner> });\n> diff --git a/gcc/testsuite/g++.dg/reflect/test.json b/gcc/testsuite/g++.dg/reflect/test.json\n> new file mode 100644\n> index 00000000000..b95cd80b88e\n> --- /dev/null\n> +++ b/gcc/testsuite/g++.dg/reflect/test.json\n> @@ -0,0 +1,4 @@\n> +{\n> +    \"outer\": \"text\",\n> +    \"inner\": { \"field\": \"yes\", \"number\": 2996 }\n> +}\n> \n> base-commit: 5cd3889135d77bf951e4ffe169868b453c36257d","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=g3CMKjcE;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=g3CMKjcE","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fh0Y95JCQz1y1G\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 08:34:37 +1100 (AEDT)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 08CCD4BB58E1\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 25 Mar 2026 21:34:35 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 551864BB3BFB\n for <gcc-patches@gcc.gnu.org>; Wed, 25 Mar 2026 21:33:41 +0000 (GMT)","from mail-wr1-f69.google.com (mail-wr1-f69.google.com\n [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-151-Kp1GQKfbN5imzZkI2VhAgQ-1; Wed, 25 Mar 2026 17:33:38 -0400","by mail-wr1-f69.google.com with SMTP id\n ffacd0b85a97d-439af7ba802so223775f8f.2\n for <gcc-patches@gcc.gnu.org>; Wed, 25 Mar 2026 14:33:38 -0700 (PDT)","from [192.168.21.207] ([109.159.201.83])\n by smtp.gmail.com with ESMTPSA id\n ffacd0b85a97d-43b919dfb54sm2877284f8f.31.2026.03.25.14.33.34\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Wed, 25 Mar 2026 14:33:34 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 08CCD4BB58E1","OpenDKIM Filter v2.11.0 sourceware.org 551864BB3BFB"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 551864BB3BFB","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 551864BB3BFB","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1774474421; cv=none;\n b=DcMNNn9VeyKgGRP5wxUKzI9JDXYx6qdmCLkfLRZ2A0FdvvoIMJNYY09B1pIQGCyxVKQGTYuAQvDmNpbQFYMLFxpF28695IfqapgqimFdD4CUmly2c8yg/B5d0yQgNgr1N0YqY4Lp64D5lwG7215kdEzWuM91ND8g1W5x7+FYY0s=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1774474421; c=relaxed/simple;\n bh=aNEMMGOOH25gRxXjejj0kzWyHPVTigfJ/jgk16ormT8=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From;\n b=d5MifCzt/UcYa7NohXupODB3X0GgKne+50nGjedum0gQenwcanLDrpMLI9XWkJNjFFplNgRcM/Sl+n19mE+jmXmTq31yJ4qVqjfLknrWMbtRNMsQhV/YZYJhLpk7Kw/PCCAP2HxnvhoyWy5QP870XM1K2W0bqGr0QFEgALoxg/4=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1774474421;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Mnh5UwYU5CE79ThL/wIH+PenMow/wuO7ddVir1xhcho=;\n b=g3CMKjcEeJrmViXB63iByimin95jQ5gx9zlCIbDT9sTJxxKIMQHsZDj1ugAM+GoLRGrmte\n EfLBD05eF8GA8GtFICmMvfO+jxAUJvrwwHn77sRvWWdpT0ZrqVdM8dIXa+fc9JNx2zHYbr\n ADb6skjknpGuTYLFdDPzliecyMipQKo=","X-MC-Unique":"Kp1GQKfbN5imzZkI2VhAgQ-1","X-Mimecast-MFC-AGG-ID":"Kp1GQKfbN5imzZkI2VhAgQ_1774474418","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774474417; x=1775079217;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=Mnh5UwYU5CE79ThL/wIH+PenMow/wuO7ddVir1xhcho=;\n b=BDwNWv50HIo8OC2YVbAvqJ4hChf9MGGUrSno+ezock1xZO9rCMhqRHtzbGRWs0bcYL\n laP9o3oLCVUIt170zu7gW/oEXIHxQgP6FsD+OjNC6/GN00hDXwW+366Dh8r6fvebQMw0\n OGR/jRM8R+eHOPAjptmMRQXcA8CJmBEeWi+9CPEv4iAx6GG5NMR7rCkO/55XFKJfHPxP\n stC6MN1T7J9UyPKE4TzVWIDACcGevN2kc0EZ183SfKsydI9CK5+CNMBgC/ldDY0/0wVX\n r0ybTgDbVMdqxxItI3Jpx1mYWmqUT4kYVE8VKNRoNzuqpJ9HUq+qsM5lzF+ato7IJVq8\n rQSQ==","X-Gm-Message-State":"AOJu0Yw/hAXspsURzq+ALRq07uIYB+71NJeeviPcm35aAFdqJtAeP+hY\n FFbhi2cawQFeaKClM854hXnaBS1aDzqxW4F2OwIS1hTNQrv1i8Seb6t1I+/uteL6whsf0fQEYrM\n msh/tz1tLATHOwX2tnStG1jVlCt2qQekjMWYIR/OfESiwA0QnQFLeN9xK/QKvOO3uSWgnJLKJ","X-Gm-Gg":"ATEYQzyx1hGp5n0onW0RcYGLwv45VSOh7ogLNwp8iaP3wVJee5xJ0yqdbpbSApIkY6g\n n3kGKKDPaZHP4kvvBY5lYuVdaa7tSP7gck8EiCOD5tDroe8JwtcaBNqcHPQMJgkw1LkSfcHCxqX\n KjMUQ1aejNZgqCP93mLg0MSlPbMNAB+jyWInv67E6e8KMDpeXS79ZbfyGolpJ+XJi9AoVGlPHPn\n 8rVrdpSR57O4XnpUzO1SrmFNt80DvHpQzDjAUUTzd66shBUvk0UZRoSM1RDYqsPWcmb2/o6kf3l\n 18k9llsSwsE/tFah13xz12H+eTRKDaGKNV5CN7PZn+LPFyom4MJR7svH9znPyzkS+YfkTivKSPh\n K8kP0aKwvwtKi/oeIgqIIDuMZ","X-Received":["by 2002:a05:6000:40c7:b0:43b:4396:674c with SMTP id\n ffacd0b85a97d-43b88a39bc5mr7425097f8f.55.1774474416304;\n Wed, 25 Mar 2026 14:33:36 -0700 (PDT)","by 2002:a05:6000:40c7:b0:43b:4396:674c with SMTP id\n ffacd0b85a97d-43b88a39bc5mr7425031f8f.55.1774474415356;\n Wed, 25 Mar 2026 14:33:35 -0700 (PDT)"],"Message-ID":"<61dd8ddd-21d5-4da0-9949-08acf979e116@redhat.com>","Date":"Wed, 25 Mar 2026 21:33:33 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2] c++/reflection: ICE with substitute and undeduced auto\n [PR123613]","To":"Marek Polacek <polacek@redhat.com>","Cc":"GCC Patches <gcc-patches@gcc.gnu.org>, Jakub Jelinek <jakub@redhat.com>","References":"<20260319180156.1398725-1-polacek@redhat.com>\n <5d918cf0-da0a-4043-8946-7e70566ede9c@redhat.com>\n <acLrujgOt2w8gd5_@redhat.com>","From":"Jason Merrill <jason@redhat.com>","In-Reply-To":"<acLrujgOt2w8gd5_@redhat.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"MAnMlKlfSSVUJ5ed5MTAw8eBWubQ-DYcwG_30k5aipM_1774474418","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]