[{"id":33777,"web_url":"https://patchwork.libcamera.org/comment/33777/","msgid":"<20250331162158.GE14432@pendragon.ideasonboard.com>","date":"2025-03-31T16:21:58","subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Barnabás,\n\nThank you for the patch.\n\nOn Mon, Mar 31, 2025 at 06:03:01PM +0200, Barnabás Pőcze wrote:\n> Use `if constexpr` instead of SFINAE to handle return values of type `void`.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  include/libcamera/base/bound_method.h | 17 ++++++-----------\n>  1 file changed, 6 insertions(+), 11 deletions(-)\n> \n> diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h\n> index dd3488eeb..aad75c02a 100644\n> --- a/include/libcamera/base/bound_method.h\n> +++ b/include/libcamera/base/bound_method.h\n> @@ -98,21 +98,16 @@ public:\n>  \tusing PackType = BoundMethodPack<R, Args...>;\n>  \n>  private:\n> -\ttemplate<std::size_t... I, typename T = R>\n> -\tstd::enable_if_t<!std::is_void<T>::value, void>\n> +\ttemplate<std::size_t... I>\n> +\tvoid\n>  \tinvokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n\nYou can write\n\n\ttemplate<std::size_t... I>\n\tvoid invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n\n>  \t{\n>  \t\tPackType *args = static_cast<PackType *>(pack);\n> -\t\targs->ret_ = invoke(std::get<I>(args->args_)...);\n> -\t}\n>  \n> -\ttemplate<std::size_t... I, typename T = R>\n> -\tstd::enable_if_t<std::is_void<T>::value, void>\n> -\tinvokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> -\t{\n> -\t\t/* args is effectively unused when the sequence I is empty. */\n> -\t\tPackType *args [[gnu::unused]] = static_cast<PackType *>(pack);\n> -\t\tinvoke(std::get<I>(args->args_)...);\n> +\t\tif constexpr (!std::is_void_v<R>)\n> +\t\t\targs->ret_ = invoke(std::get<I>(args->args_)...);\n> +\t\telse\n> +\t\t\tinvoke(std::get<I>(args->args_)...);\n\nI'm surprised that this works. I didn't know that within a templated\nentity the discarded statement is not instantiated. It's interesting.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \t}\n>  \n>  public:","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 95C9BC323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 31 Mar 2025 16:22:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4CB7B68988;\n\tMon, 31 Mar 2025 18:22:23 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F008D6897A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 31 Mar 2025 18:22:21 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5A175725;\n\tMon, 31 Mar 2025 18:20:30 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"PBs75zew\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743438030;\n\tbh=aVDeiPqiybuYif4bN90+d+fgNsvtDT4zgJzYf/Kiso0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=PBs75zewEMrosxY/7dLVdDDIGmkhDW81AceSaM/C1xlceBItQTqoIxQ3xkpIZVfBO\n\tgVCCzHtxn0j8M1BdUOKtIfznJAsm6plCQyHPydZq8qZoQ9En4yVktVf7SSvC12514T\n\ttAGcECv7d/a/jipesAVfPIgfN4/U/J1PCeaH5vyo=","Date":"Mon, 31 Mar 2025 19:21:58 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","Message-ID":"<20250331162158.GE14432@pendragon.ideasonboard.com>","References":"<20250331160301.534243-1-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20250331160301.534243-1-barnabas.pocze@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33790,"web_url":"https://patchwork.libcamera.org/comment/33790/","msgid":"<174344031177.3394313.14389051657307593512@ping.linuxembedded.co.uk>","date":"2025-03-31T16:58:31","subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2025-03-31 17:21:58)\n> Hi Barnabás,\n> \n> Thank you for the patch.\n> \n> On Mon, Mar 31, 2025 at 06:03:01PM +0200, Barnabás Pőcze wrote:\n> > Use `if constexpr` instead of SFINAE to handle return values of type `void`.\n> > \n> > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> > ---\n> >  include/libcamera/base/bound_method.h | 17 ++++++-----------\n> >  1 file changed, 6 insertions(+), 11 deletions(-)\n> > \n> > diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h\n> > index dd3488eeb..aad75c02a 100644\n> > --- a/include/libcamera/base/bound_method.h\n> > +++ b/include/libcamera/base/bound_method.h\n> > @@ -98,21 +98,16 @@ public:\n> >       using PackType = BoundMethodPack<R, Args...>;\n> >  \n> >  private:\n> > -     template<std::size_t... I, typename T = R>\n> > -     std::enable_if_t<!std::is_void<T>::value, void>\n> > +     template<std::size_t... I>\n> > +     void\n> >       invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> \n> You can write\n> \n>         template<std::size_t... I>\n>         void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> \n> >       {\n> >               PackType *args = static_cast<PackType *>(pack);\n> > -             args->ret_ = invoke(std::get<I>(args->args_)...);\n> > -     }\n> >  \n> > -     template<std::size_t... I, typename T = R>\n> > -     std::enable_if_t<std::is_void<T>::value, void>\n> > -     invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> > -     {\n> > -             /* args is effectively unused when the sequence I is empty. */\n> > -             PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);\n> > -             invoke(std::get<I>(args->args_)...);\n> > +             if constexpr (!std::is_void_v<R>)\n> > +                     args->ret_ = invoke(std::get<I>(args->args_)...);\n> > +             else\n> > +                     invoke(std::get<I>(args->args_)...);\n> \n> I'm surprised that this works. I didn't know that within a templated\n> entity the discarded statement is not instantiated. It's interesting.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nNo chance of me putting a reviewed by tag on template magic - it would\nbe a lie ;-)\n\nBut if Laurent's happy with this - and the CI passes, I'm fine to merge\nit...\n\nAcked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> \n> >       }\n> >  \n> >  public:\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E9498C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 31 Mar 2025 16:58:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2F67768985;\n\tMon, 31 Mar 2025 18:58:36 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 64CBC68967\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 31 Mar 2025 18:58:34 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B6C02725;\n\tMon, 31 Mar 2025 18:56:42 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ZBwhepq0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743440202;\n\tbh=dPW/JfkCTX6DdJlBBLtg4ToUY1iB3bo2z14MIdiitNc=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=ZBwhepq0LF42Oq8H7aW9CUN4/wDOVCeW5TC/AnaGyDrveA4fO7kbZ5FogXE79gNYw\n\tYfLlEU4FLmDBMk33JrjZo/Y9/OAP9Bs3Ku7n5Pzp2pcbmqY0GlMe6sQnvVmQuvqkWn\n\tF55TKIOEfCuJMLL/Hux2CWfFIbulcnvdMXYrzemo=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250331162158.GE14432@pendragon.ideasonboard.com>","References":"<20250331160301.534243-1-barnabas.pocze@ideasonboard.com>\n\t<20250331162158.GE14432@pendragon.ideasonboard.com>","Subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Date":"Mon, 31 Mar 2025 17:58:31 +0100","Message-ID":"<174344031177.3394313.14389051657307593512@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33812,"web_url":"https://patchwork.libcamera.org/comment/33812/","msgid":"<174344483413.3394313.16504898120052367516@ping.linuxembedded.co.uk>","date":"2025-03-31T18:13:54","subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Kieran Bingham (2025-03-31 17:58:31)\n> Quoting Laurent Pinchart (2025-03-31 17:21:58)\n> > Hi Barnabás,\n> > \n> > Thank you for the patch.\n> > \n> > On Mon, Mar 31, 2025 at 06:03:01PM +0200, Barnabás Pőcze wrote:\n> > > Use `if constexpr` instead of SFINAE to handle return values of type `void`.\n> > > \n> > > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> > > ---\n> > >  include/libcamera/base/bound_method.h | 17 ++++++-----------\n> > >  1 file changed, 6 insertions(+), 11 deletions(-)\n> > > \n> > > diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h\n> > > index dd3488eeb..aad75c02a 100644\n> > > --- a/include/libcamera/base/bound_method.h\n> > > +++ b/include/libcamera/base/bound_method.h\n> > > @@ -98,21 +98,16 @@ public:\n> > >       using PackType = BoundMethodPack<R, Args...>;\n> > >  \n> > >  private:\n> > > -     template<std::size_t... I, typename T = R>\n> > > -     std::enable_if_t<!std::is_void<T>::value, void>\n> > > +     template<std::size_t... I>\n> > > +     void\n> > >       invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> > \n> > You can write\n> > \n> >         template<std::size_t... I>\n> >         void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> > \n> > >       {\n> > >               PackType *args = static_cast<PackType *>(pack);\n> > > -             args->ret_ = invoke(std::get<I>(args->args_)...);\n> > > -     }\n> > >  \n> > > -     template<std::size_t... I, typename T = R>\n> > > -     std::enable_if_t<std::is_void<T>::value, void>\n> > > -     invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n> > > -     {\n> > > -             /* args is effectively unused when the sequence I is empty. */\n> > > -             PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);\n> > > -             invoke(std::get<I>(args->args_)...);\n> > > +             if constexpr (!std::is_void_v<R>)\n> > > +                     args->ret_ = invoke(std::get<I>(args->args_)...);\n> > > +             else\n> > > +                     invoke(std::get<I>(args->args_)...);\n> > \n> > I'm surprised that this works. I didn't know that within a templated\n> > entity the discarded statement is not instantiated. It's interesting.\n> > \n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> No chance of me putting a reviewed by tag on template magic - it would\n> be a lie ;-)\n> \n> But if Laurent's happy with this - and the CI passes, I'm fine to merge\n> it...\n\nUnfortunately, it didn't pass :\n\nhttps://gitlab.freedesktop.org/camera/libcamera/-/jobs/73682114\n\n> \n> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> > \n> > >       }\n> > >  \n> > >  public:\n> > \n> > -- \n> > Regards,\n> > \n> > Laurent Pinchart","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E0628C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 31 Mar 2025 18:13:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9635D68967;\n\tMon, 31 Mar 2025 20:13:58 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 74CE168967\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 31 Mar 2025 20:13:57 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E3285725;\n\tMon, 31 Mar 2025 20:12:05 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"NCKI0bgS\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743444726;\n\tbh=6E7zdOCUbRxcpgDx50hUg5ot01bFnauOy8IQEWoq7Kw=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=NCKI0bgSKLknr0T/zgy48Sowc8EdfrwqNuvwSn3vuyVkjvtGlOpXQEB6Er3e7man8\n\t8RCTHLg6TeqObk6YtgzLjWXXIU6w39fzmK7oJSR2hAzJ737EkJISka2DYid375QeZi\n\tl9ouZvXjV4eNRChKQb+zHb9B+Q792XEWnuCUWBVA=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<174344031177.3394313.14389051657307593512@ping.linuxembedded.co.uk>","References":"<20250331160301.534243-1-barnabas.pocze@ideasonboard.com>\n\t<20250331162158.GE14432@pendragon.ideasonboard.com>\n\t<174344031177.3394313.14389051657307593512@ping.linuxembedded.co.uk>","Subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Date":"Mon, 31 Mar 2025 19:13:54 +0100","Message-ID":"<174344483413.3394313.16504898120052367516@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33813,"web_url":"https://patchwork.libcamera.org/comment/33813/","msgid":"<a36373ef-c404-4c4b-a099-30efbef2cb47@ideasonboard.com>","date":"2025-03-31T18:18:03","subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 03. 31. 20:13 keltezéssel, Kieran Bingham írta:\n> Quoting Kieran Bingham (2025-03-31 17:58:31)\n>> Quoting Laurent Pinchart (2025-03-31 17:21:58)\n>>> Hi Barnabás,\n>>>\n>>> Thank you for the patch.\n>>>\n>>> On Mon, Mar 31, 2025 at 06:03:01PM +0200, Barnabás Pőcze wrote:\n>>>> Use `if constexpr` instead of SFINAE to handle return values of type `void`.\n>>>>\n>>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>>>> ---\n>>>>   include/libcamera/base/bound_method.h | 17 ++++++-----------\n>>>>   1 file changed, 6 insertions(+), 11 deletions(-)\n>>>>\n>>>> diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h\n>>>> index dd3488eeb..aad75c02a 100644\n>>>> --- a/include/libcamera/base/bound_method.h\n>>>> +++ b/include/libcamera/base/bound_method.h\n>>>> @@ -98,21 +98,16 @@ public:\n>>>>        using PackType = BoundMethodPack<R, Args...>;\n>>>>   \n>>>>   private:\n>>>> -     template<std::size_t... I, typename T = R>\n>>>> -     std::enable_if_t<!std::is_void<T>::value, void>\n>>>> +     template<std::size_t... I>\n>>>> +     void\n>>>>        invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n>>>\n>>> You can write\n>>>\n>>>          template<std::size_t... I>\n>>>          void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n>>>\n>>>>        {\n>>>>                PackType *args = static_cast<PackType *>(pack);\n>>>> -             args->ret_ = invoke(std::get<I>(args->args_)...);\n>>>> -     }\n>>>>   \n>>>> -     template<std::size_t... I, typename T = R>\n>>>> -     std::enable_if_t<std::is_void<T>::value, void>\n>>>> -     invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)\n>>>> -     {\n>>>> -             /* args is effectively unused when the sequence I is empty. */\n>>>> -             PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);\n>>>> -             invoke(std::get<I>(args->args_)...);\n>>>> +             if constexpr (!std::is_void_v<R>)\n>>>> +                     args->ret_ = invoke(std::get<I>(args->args_)...);\n>>>> +             else\n>>>> +                     invoke(std::get<I>(args->args_)...);\n>>>\n>>> I'm surprised that this works. I didn't know that within a templated\n>>> entity the discarded statement is not instantiated. It's interesting.\n>>>\n>>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>>\n>> No chance of me putting a reviewed by tag on template magic - it would\n>> be a lie ;-)\n>>\n>> But if Laurent's happy with this - and the CI passes, I'm fine to merge\n>> it...\n> \n> Unfortunately, it didn't pass :\n> \n> https://gitlab.freedesktop.org/camera/libcamera/-/jobs/73682114\n\nYes, I know; it's missing a `[[maybe_unused]]`, but I did not want to\nresend it immediately, but it passes with that small change:\nhttps://gitlab.freedesktop.org/pobrn/libcamera/-/pipelines/1393539\n\n\nRegards,\nBarnabás Pőcze\n\n\n> \n>>\n>> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>>\n>>>\n>>>>        }\n>>>>   \n>>>>   public:\n>>>\n>>> -- \n>>> Regards,\n>>>\n>>> Laurent Pinchart","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 43F9EC3213\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 31 Mar 2025 18:18:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 653126897A;\n\tMon, 31 Mar 2025 20:18:10 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A4B36897A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 31 Mar 2025 20:18:08 +0200 (CEST)","from [192.168.33.23] (185.221.143.221.nat.pool.zt.hu\n\t[185.221.143.221])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8CFF4725;\n\tMon, 31 Mar 2025 20:16:16 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"AySpiAMg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743444976;\n\tbh=3Ha1fKURhvO+Hjl3Q28a+ucSaJTfTDprdc4w/3g90zU=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=AySpiAMg3fbnIgeShaiGj62AOuj9UyJ4aee31WItGPEbNv8y1ACjytqXAhGanDERn\n\tjc9Hyf1EwDF/DbTxTtjFLBs9gSNn2JZoIgvDsc9tUKpzjNmVueyLlahab6qbhnX2zN\n\t6HFg6DcmCqdBb6goj7rF4LJ17XRpJtnAsVgxkYkQ=","Message-ID":"<a36373ef-c404-4c4b-a099-30efbef2cb47@ideasonboard.com>","Date":"Mon, 31 Mar 2025 20:18:03 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1] libcamera: base: bound_method: Simplify\n\t`invokePack()`","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250331160301.534243-1-barnabas.pocze@ideasonboard.com>\n\t<20250331162158.GE14432@pendragon.ideasonboard.com>\n\t<174344031177.3394313.14389051657307593512@ping.linuxembedded.co.uk>\n\t<174344483413.3394313.16504898120052367516@ping.linuxembedded.co.uk>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<174344483413.3394313.16504898120052367516@ping.linuxembedded.co.uk>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]