From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 45FB73851891; Fri, 18 Nov 2022 08:42:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 45FB73851891 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668760965; bh=b9zAhUi5wdiGoQOA0I5p+J5ofPkOF/KgvmJ+Jzz+TTg=; h=From:To:Subject:Date:In-Reply-To:References:From; b=E7tC3BIrSkSki/ycZcLixQGoVyp2dh7MkQogSQTkoIFiolOXXqrR3KMhAHVroNhVj NrNtFtW+ZFW5NYS5eHaF7NNZmaQEms5mkbYd6npVtVPTOofayUrP+CwrQVdbq3JCvP 8vgysAk7o+5976urwMJ9/f+qxjtpcJV3DFMANACI= From: "slyfox at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug middle-end/107661] [13 Regression] lambdas get merged incorrectly in tempaltes, cause llvm-12 miscompilation since r13-3358-ge0403e95689af7 Date: Fri, 18 Nov 2022 08:42:41 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: middle-end X-Bugzilla-Version: 13.0 X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: blocker X-Bugzilla-Who: slyfox at gcc dot gnu.org X-Bugzilla-Status: ASSIGNED X-Bugzilla-Resolution: X-Bugzilla-Priority: P1 X-Bugzilla-Assigned-To: jamborm at gcc dot gnu.org X-Bugzilla-Target-Milestone: 13.0 X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D107661 --- Comment #8 from Sergei Trofimovich --- (In reply to Sergei Trofimovich from comment #7) > When debug reports unqualified `Aggregate replacements: 1[0]=3Dcallback_f= n` > does it mean ipa-cp does not distinguish between: > * static void function_ref::callback_fn(void*) [with Callable =3D > seemingly_unused_foo(int)::L]/30. > * static void function_ref::callback_fn(void*) [with Callable =3D void(= )]/29. > ? >=20 > I suspect it does not and that results in a wrong callback_fn inline. That was not it. Identical names is a printing artifact. I shrunk example a bit more to avoid any overloads and crashes. Now example just prints different things. // How to break: // $ ./gcc-13-snap/bin/gcc -O1 -fipa-cp -fipa-cp-clone a.cc= -o a && ./a // GOOD // BAD // $ ./gcc-13-snap/bin/gcc -O1 -fipa-cp -fipa-cp-clone -DDISABLE_HACK a.cc = -o a && ./a // GOOD // GOOD // #define DISABLE_HACK 1 #include struct R {} RGood; struct L {} LBad; static void L_run(void) { fprintf(stderr, "BAD\n"); } static void callback_fn_L(void) { L_run(); } static void callback_fn_R(void) { fprintf(stderr, "GOOD\n"); } struct function_ref { void (*callback)(void) =3D nullptr; function_ref(L * pl) { callback =3D callback_fn_L; } function_ref(R * pr) { callback =3D callback_fn_R; } }; // allow one level of recursion to call callback twice static int is_recur(void) { static int n =3D 0; switch (n++) { case 0: return 1; default: return 0; } } static void do3(volatile int * punused, function_ref Expired) { Expired.callback(); if (is_recur()) do3(punused, Expired); } static void do1(function_ref Expired) { volatile int unused =3D 42; do3(&unused, Expired); } int main(void) { do1(&RGood); } #if defined(DISABLE_HACK) #else void seemingly_unused_foo(void) { do1(&LBad); } #endif=