[{"id":3675712,"web_url":"http://patchwork.ozlabs.org/comment/3675712/","msgid":"<60225664-7026-rp1p-sppp-q201s3146soo@fhfr.qr>","list_archive_url":null,"date":"2026-04-10T07:53:23","subject":"Re: [PATCH] warn-access: -Winvalid-memory-model fixes [PR124827]","submitter":{"id":4338,"url":"http://patchwork.ozlabs.org/api/people/4338/","name":"Richard Biener","email":"rguenther@suse.de"},"content":"On Fri, 10 Apr 2026, Jakub Jelinek wrote:\n\n> Hi!\n> \n> A few years ago Martin moved for unknown reasons -Winvalid-memory-model\n> diagnostics from expansion to the gimple-ssa-warn-access middle end warning\n> black hole.\n> A recent change limited the second instance of the pass to only a small\n> subset of warnings.\n> This regressed diagnostics of -Winvalid-memory-model with -fsanitize=thread,\n> because invalid cases are not warned about anymore during waccess2 and\n> during waccess3 we've already transformed those builtins into corresponding\n> tsan builtins.\n> \n> The following patch fixes that regression by handling the tsan atomic\n> builtins as well.  While doing that, I've also fixed formatting and noticed\n> other bogosities in the code, e.g. existance of xchg_models.  No idea\n> where Martin got that from, neither C11, nor C23, nor various versions of\n> C++ nor GCC documentation have any restrictions on what memory models can be\n> used for atomic_exchange_explicit, so why is it trying to prevent\n> __ATOMIC_ACQUIRE?\n> And incorrectly so, __atomic_exchange_N has 3 arguments, and suc_arg is 0\n> based, so setting it to 3 meant it didn't check anything because the 4th\n> argument doesn't exist.  So fixed to use all_models with the correct arg\n> index.\n> \n> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?\n\nOK.\n\n> Besides this, there is another problem that we fold some atomic builtins\n> into IFN_ATOMIC* internal functions.  That isn't a 16 Regression though,\n> could be fixed by also diagnosing this stuff for the IFN_ATOMIC_* calls,\n> but I'm not doing it right now because there is yet another problem.\n> C++17 in https://wg21.link/p0418r2 dropped some of the restrictions, in\n> particular that for the compare and exchange cases failure mode can't be\n> stronger than success mode.  So I'm hesistant to add further warnings for\n> 16 (beyond just fixing the -fsanitize=thread inconsistency), unsure if\n> we should somehow mark the atomic builtins from the C++ <atomic> APIs\n> that the no stronger checking shouldn't be done for those, or simply\n> mark those for all of C++17 and later, something else?\n> C23/C2Y I think still require it and it is reasonable requirement,\n\nHmm, I think we could diagnose anyway based on inter-operability with\nearlier standards and C?\n\n> 2026-04-10  <jakub@redhat.com>\n> \n> \tPR middle-end/124827\n> \t* gimple-ssa-warn-access.cc (xchg_models): Remove.\n> \t(pass_waccess::check_atomic_builtin): Fix up sucs_arg for\n> \tBUILT_IN_ATOMIC_EXCHAGE_* and use all_models instead of xchg_models.\n> \tHandle BUILT_IN_TSAN_ATOMIC*.  Formatting fixes.\n> \n> \t* gcc.dg/tsan/atomic-invalid.c: New test.\n> \n> --- gcc/gimple-ssa-warn-access.cc.jj\t2026-03-27 10:17:14.170330152 +0100\n> +++ gcc/gimple-ssa-warn-access.cc\t2026-04-09 21:06:20.774780936 +0200\n> @@ -2940,7 +2940,6 @@ memmodel_name (unsigned HOST_WIDE_INT va\n>  /* Indices of valid MEMORY_MODELS above for corresponding atomic operations.  */\n>  static const unsigned char load_models[] = { 0, 1, 2, 3, UCHAR_MAX };\n>  static const unsigned char store_models[] = { 0, 1, 4, UCHAR_MAX };\n> -static const unsigned char xchg_models[] = { 0, 1, 3, 4, 5, UCHAR_MAX };\n>  static const unsigned char flag_clr_models[] = { 0, 1, 4, UCHAR_MAX };\n>  static const unsigned char all_models[] = { 0, 1, 2, 3, 4, 5, UCHAR_MAX };\n>  \n> @@ -3097,7 +3096,7 @@ pass_waccess::check_atomic_builtin (gcal\n>    switch (DECL_FUNCTION_CODE (callee))\n>      {\n>  #define BUILTIN_ACCESS_SIZE_FNSPEC(N)\t\t\t\\\n> -      BUILT_IN_SYNC_FETCH_AND_ADD_ ## N:\t\t\\\n> +\t BUILT_IN_SYNC_FETCH_AND_ADD_ ## N:\t\t\\\n>      case BUILT_IN_SYNC_FETCH_AND_SUB_ ## N:\t\t\\\n>      case BUILT_IN_SYNC_FETCH_AND_OR_ ## N:\t\t\\\n>      case BUILT_IN_SYNC_FETCH_AND_AND_ ## N:\t\t\\\n> @@ -3135,23 +3134,23 @@ pass_waccess::check_atomic_builtin (gcal\n>      case BUILT_IN_ATOMIC_FETCH_NAND_ ## N:\t\t\\\n>      case BUILT_IN_ATOMIC_FETCH_OR_ ## N:\t\t\\\n>      case BUILT_IN_ATOMIC_FETCH_XOR_ ## N:\t\t\\\n> -\tbytes = N;\t\t\t\t\t\\\n> -\tif (sucs_arg == UINT_MAX)\t\t\t\\\n> -\t  sucs_arg = 2;\t\t\t\t\t\\\n> -\tif (!pvalid_models)\t\t\t\t\\\n> -\t  pvalid_models = all_models;\t\t\t\\\n> -\tbreak;\t\t\t\t\t\t\\\n> +      bytes = N;\t\t\t\t\t\\\n> +      if (sucs_arg == UINT_MAX)\t\t\t\t\\\n> +\tsucs_arg = 2;\t\t\t\t\t\\\n> +      if (!pvalid_models)\t\t\t\t\\\n> +\tpvalid_models = all_models;\t\t\t\\\n> +      break;\t\t\t\t\t\t\\\n>      case BUILT_IN_ATOMIC_EXCHANGE_ ## N:\t\t\\\n> -\tbytes = N;\t\t\t\t\t\\\n> -\tsucs_arg = 3;\t\t\t\t\t\\\n> -\tpvalid_models = xchg_models;\t\t\t\\\n> -\tbreak;\t\t\t\t\t\t\\\n> +      bytes = N;\t\t\t\t\t\\\n> +      sucs_arg = 2;\t\t\t\t\t\\\n> +      pvalid_models = all_models;\t\t\t\\\n> +      break;\t\t\t\t\t\t\\\n>      case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_ ## N:\t\\\n> -\tbytes = N;\t\t\t\t\t\\\n> -\tsucs_arg = 4;\t\t\t\t\t\\\n> -\tfail_arg = 5;\t\t\t\t\t\\\n> -\tpvalid_models = all_models;\t\t\t\\\n> -\targ2 = 1\n> +      bytes = N;\t\t\t\t\t\\\n> +      sucs_arg = 4;\t\t\t\t\t\\\n> +      fail_arg = 5;\t\t\t\t\t\\\n> +      pvalid_models = all_models;\t\t\t\\\n> +      arg2 = 1\n>  \n>      case BUILTIN_ACCESS_SIZE_FNSPEC (1);\n>        break;\n> @@ -3169,6 +3168,55 @@ pass_waccess::check_atomic_builtin (gcal\n>        pvalid_models = flag_clr_models;\n>        break;\n>  \n> +#define BUILTIN_TSAN_ACCESS_SIZE_FNSPEC(N)\t\t\\\n> +\t BUILT_IN_TSAN_ATOMIC ## N ##_LOAD:\t\t\\\n> +      pvalid_models = load_models;\t\t\t\\\n> +      sucs_arg = 1;\t\t\t\t\t\\\n> +      /* FALLTHROUGH */\t\t\t\t\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_STORE:\t\t\\\n> +      if (!pvalid_models)\t\t\t\t\\\n> +\tpvalid_models = store_models;\t\t\t\\\n> +      /* FALLTHROUGH */\t\t\t\t\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_ADD:\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_SUB:\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_AND:\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_NAND:\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_OR:\t\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_XOR:\t\\\n> +      bytes = N / 8;\t\t\t\t\t\\\n> +      if (sucs_arg == UINT_MAX)\t\t\t\t\\\n> +\tsucs_arg = 2;\t\t\t\t\t\\\n> +      if (!pvalid_models)\t\t\t\t\\\n> +\tpvalid_models = all_models;\t\t\t\\\n> +      break;\t\t\t\t\t\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_EXCHANGE:\t\t\\\n> +      bytes = N / 8;\t\t\t\t\t\\\n> +      sucs_arg = 2;\t\t\t\t\t\\\n> +      pvalid_models = all_models;\t\t\t\\\n> +      break;\t\t\t\t\t\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_COMPARE_EXCHANGE_STRONG:\t\\\n> +    case BUILT_IN_TSAN_ATOMIC ## N ##_COMPARE_EXCHANGE_WEAK:\t\\\n> +      bytes = N / 8;\t\t\t\t\t\\\n> +      sucs_arg = 3;\t\t\t\t\t\\\n> +      fail_arg = 4;\t\t\t\t\t\\\n> +      pvalid_models = all_models;\t\t\t\\\n> +      arg2 = 1\n> +\n> +    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (8);\n> +      break;\n> +\n> +    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (16);\n> +      break;\n> +\n> +    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (32);\n> +      break;\n> +\n> +    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (64);\n> +      break;\n> +\n> +    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (128);\n> +      break;\n> +\n>      default:\n>        return false;\n>      }\n> --- gcc/testsuite/gcc.dg/tsan/atomic-invalid.c.jj\t2026-04-09 12:09:55.573630279 +0200\n> +++ gcc/testsuite/gcc.dg/tsan/atomic-invalid.c\t2026-04-09 12:10:59.919528626 +0200\n> @@ -0,0 +1,39 @@\n> +/* PR middle-end/124827 */\n> +/* Test __atomic routines for invalid memory model errors. This only needs\n> +   to be tested on a single size.  */\n> +/* { dg-do compile } */\n> +/* { dg-require-effective-target sync_int_long } */\n> +/* { dg-options \"-fsanitize=thread -Winvalid-memory-model\" } */\n> +\n> +int i, e, b;\n> +bool x;\n> +\n> +[[gnu::always_inline]] static inline void\n> +foo (int relaxed, int seq_cst, int acquire, int release, int acq_rel, int consume)\n> +{\n> +  __atomic_compare_exchange_n (&i, &e, 1, 0, relaxed, seq_cst); /* { dg-warning \"failure memory model 'memory_order_seq_cst' cannot be stronger\" } */\n> +  __atomic_compare_exchange_n (&i, &e, 1, 0, seq_cst, release); /* { dg-warning \"invalid failure memory\" } */\n> +  __atomic_compare_exchange_n (&i, &e, 1, 1, seq_cst, acq_rel); /* { dg-warning \"invalid failure memory\" } */\n> +\n> +  __atomic_load_n (&i, release); /* { dg-warning \"invalid memory model\" } */\n> +  __atomic_load_n (&i, acq_rel); /* { dg-warning \"invalid memory model\" } */\n> +\n> +  __atomic_store_n (&i, 1, acquire); /* { dg-warning \"invalid memory model\" } */\n> +  __atomic_store_n (&i, 1, consume); /* { dg-warning \"invalid memory model\" } */\n> +  __atomic_store_n (&i, 1, acq_rel); /* { dg-warning \"invalid memory model\" } */\n> +\n> +  __atomic_load_n (&i, 44); /* { dg-warning \"invalid memory model\" } */\n> +\n> +  __atomic_clear (&x, consume); /* { dg-warning \"invalid memory model\" } */\n> +  __atomic_clear (&x, acquire); /* { dg-warning \"invalid memory model\" } */\n> +\n> +  __atomic_clear (&x, acq_rel); /* { dg-warning \"invalid memory model\" } */\n> +\n> +}\n> +\n> +int\n> +main ()\n> +{\n> +  foo (__ATOMIC_RELAXED, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE, __ATOMIC_RELEASE,\n> +       __ATOMIC_ACQ_REL, __ATOMIC_CONSUME);\n> +}\n> \n> \tJakub\n> \n>","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=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=xR5EVsc1;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=26M0Mjbd;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=xR5EVsc1;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=26M0Mjbd;\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=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=xR5EVsc1;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=26M0Mjbd;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=xR5EVsc1;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=26M0Mjbd","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=suse.de","sourceware.org; spf=pass smtp.mailfrom=suse.de","server2.sourceware.org;\n arc=none smtp.remote-ip=195.135.223.130","smtp-out1.suse.de;\n\tnone"],"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 4fsTZr4HwKz1yGb\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 17:53:55 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 4CBD14BA2E05\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 07:53:53 +0000 (GMT)","from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130])\n by sourceware.org (Postfix) with ESMTPS id 662DF4BA2E04\n for <gcc-patches@gcc.gnu.org>; Fri, 10 Apr 2026 07:53:24 +0000 (GMT)","from murzim.nue2.suse.org (unknown [10.168.4.243])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out1.suse.de (Postfix) with ESMTPS id 595096A7E0;\n Fri, 10 Apr 2026 07:53:23 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 4CBD14BA2E05","OpenDKIM Filter v2.11.0 sourceware.org 662DF4BA2E04"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 662DF4BA2E04","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 662DF4BA2E04","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775807604; cv=none;\n b=uDGeLWYYYUpfwUhomPRS1560Dgn6CJJTmUYoJI/yotOJYgub+mmHh4EHEqv87WVChfUA5BuJeuMe2GSPAD3B5Pi92AHyue75uYCy7C5M4pKYjmAlzchxB7eKBgcavCFQTJTsqaSVBOAMr/3PBe42P5c/EsvhPrBizLTjUPWp4uE=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775807604; c=relaxed/simple;\n bh=09hsLMNOGAwzrLi4kWW91K5b8LI2uYb1xCZFOHVF75I=;\n h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:Date:\n From:To:Subject:Message-ID:MIME-Version;\n b=Uogu27KyUPTa7TX7d2oxUYvzi9MkhnL6fK3la64x5sYOJwcKfZZP+UexGX3M6b+P1BjCIC6FRePBAET6VS6wG+QwgON4BSMPpjrvmizgB7JqQAz07HAjmrcyfQvllI1TELIDGmwKiMBB2oeXvr7SzSAMcx3vt93QAEJc670/xWM=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1775807603;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=cHYx6NIk+v+DmUgMaXyR3IOwLFNh5MLQkSoW5UiqZ3k=;\n b=xR5EVsc1CKcbw3g576XdhV2V35odLEFhUFMqQsdoh8P5TH7xY1zVPqu1yKMmvxfGFh4iM7\n Y715eDcAVtiQ3R4djzKj17ePMKVFmy1bAt7AGUaHnapTUIJjr3glIzgU5kT/AI786rGoeG\n MtMuVdLoeOizjr4vDtDg7N6RyKt20/U=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1775807603;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=cHYx6NIk+v+DmUgMaXyR3IOwLFNh5MLQkSoW5UiqZ3k=;\n b=26M0Mjbd8jlgO3NIn4uuOOkg0aIHKDJO7r3PVpGmJ3/JwXVjpO+VmaTDbKfKNOhmH7qape\n wZsY/dD0mj37LdBA==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1775807603;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=cHYx6NIk+v+DmUgMaXyR3IOwLFNh5MLQkSoW5UiqZ3k=;\n b=xR5EVsc1CKcbw3g576XdhV2V35odLEFhUFMqQsdoh8P5TH7xY1zVPqu1yKMmvxfGFh4iM7\n Y715eDcAVtiQ3R4djzKj17ePMKVFmy1bAt7AGUaHnapTUIJjr3glIzgU5kT/AI786rGoeG\n MtMuVdLoeOizjr4vDtDg7N6RyKt20/U=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1775807603;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=cHYx6NIk+v+DmUgMaXyR3IOwLFNh5MLQkSoW5UiqZ3k=;\n b=26M0Mjbd8jlgO3NIn4uuOOkg0aIHKDJO7r3PVpGmJ3/JwXVjpO+VmaTDbKfKNOhmH7qape\n wZsY/dD0mj37LdBA=="],"Date":"Fri, 10 Apr 2026 09:53:23 +0200 (CEST)","From":"Richard Biener <rguenther@suse.de>","To":"Jakub Jelinek <jakub@redhat.com>","cc":"gcc-patches@gcc.gnu.org","Subject":"Re: [PATCH] warn-access: -Winvalid-memory-model fixes [PR124827]","In-Reply-To":"<adinl14ddmhFEhPg@tucnak>","Message-ID":"<60225664-7026-rp1p-sppp-q201s3146soo@fhfr.qr>","References":"<adinl14ddmhFEhPg@tucnak>","MIME-Version":"1.0","Content-Type":"text/plain; charset=US-ASCII","X-Spamd-Result":"default: False [-4.30 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n NEURAL_HAM_LONG(-1.00)[-1.000];\n NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain];\n MISSING_XM_UA(0.00)[]; FROM_HAS_DN(0.00)[];\n MIME_TRACE(0.00)[0:+]; ARC_NA(0.00)[];\n FUZZY_RATELIMITED(0.00)[rspamd.com]; RCPT_COUNT_TWO(0.00)[2];\n TO_DN_SOME(0.00)[]; FROM_EQ_ENVFROM(0.00)[];\n RCVD_COUNT_ZERO(0.00)[0]; TO_MATCH_ENVRCPT_ALL(0.00)[];\n DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:email]","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"}}]