From patchwork Thu May 4 01:29:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 89893 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1732317vqo; Wed, 3 May 2023 18:33:11 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7yhjFk22KbZXsevi3VXy/w/4WJ2Sn10nmhzCnOxiEfgjEaWPu9vFUe5GtsffmOWfYCgZN8 X-Received: by 2002:a17:902:b707:b0:1a6:dba5:2e3e with SMTP id d7-20020a170902b70700b001a6dba52e3emr1814614pls.25.1683163990677; Wed, 03 May 2023 18:33:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683163990; cv=none; d=google.com; s=arc-20160816; b=qTxMXaQRABCc7KLEl/d3T9+Nr33vj+j/hwCwhu6cyLMgWaHKS+0RszBgH3NqcN0rb5 RMz7uCO0mWQRksrdorOXvOY/tbvswIR8iMsEmBG/W0I+ahmvPsntZp3bKweSCKw2jQLF r2ydXNYb9Icd/ZUKbu5qUU3WsCHismbNesy3+al0euHCTSl855cSWKKlRKqenXGivWn6 Du6RK9sLC0riP0lb0eEJ2xnm9lNER9wVdqxywY4TO8DshmnWxVEuu616asF6z0/YQZta FZNweVduKY1tGFaUtbAPcCIrYdaoJzXdyc3pP5NE1NVavpV1F33XFDCV+cykLDn7kY45 o6Sw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=XG3wf9nihAUWxXofj4ZEhqUdIxbBoAkHwbzjdDxEFiI=; b=wSQo+jjV1pQLzuvpfRJF4wvsJiMXQ7hFXGhkSeezWyl9wprIKY6jersV7aHUF43sOh FPR7aN4uCSDzO8MKmOgs5SGfRAZYAQh5mIJ90tTaRMAWT3B9qa47w16kVzQ58RAfYVSF ohcz/p2C63VOwrBcTbicxoRHgRYTq4uUqnPKAIZzAo1gCjUemrFgATeQ+VOzFnyagZ5F Z1n9im7ypo1b4eHtty/0/+4ZLWNoprh3RwmSvjWgMyLFj34ajvZ/yIT9ZA9wHnqBkuGs k3dHx7nYmqL7jL9rpgjHEDRHm8uF2E3V/XrdNXoIhgPHw20ZF04Mg/pxWbaV4m+d0fC3 BLag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b=moiWwAj7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d5-20020a170903230500b001a1cefdaa33si36178704plh.342.2023.05.03.18.32.57; Wed, 03 May 2023 18:33:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b=moiWwAj7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229721AbjEDB32 (ORCPT + 99 others); Wed, 3 May 2023 21:29:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39678 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229602AbjEDB3Z (ORCPT ); Wed, 3 May 2023 21:29:25 -0400 Received: from smtpout.efficios.com (smtpout.efficios.com [167.114.26.122]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86E1A10F1 for ; Wed, 3 May 2023 18:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=efficios.com; s=smtpout1; t=1683163763; bh=T39JG5jO81CkJSiSo/IvnzdNLETorvzXw2aS+hjSu+c=; h=From:To:Cc:Subject:Date:From; b=moiWwAj7t1bORbTueVEJdVtZHDLSrYjYRWg0Ya7ToKbnd4zYjD4MQcvoP2ek5IuNH 0XoHK7zCvoLl8nO3YSELqXQB3PTJjAoX6vWGxbAOuVQZnjK0PuLBKekH2+whThoh59 Oq8Xs+zkhzbfZ05Y1FZqLWjxox0B30XJytqjm430IDH/CqkdnVieSeinOlNLuow0Q9 5QK767dGFzBup0rEo71gw1DLRifcWr6XmL9fAew0b7+yPZvGzyaJKGUIy2yC952HvY jA75/BB6gytAt2yrlrdGUvaTkq32a/ZGF5tgB6vDkJ4Q30qxbAmbWEsov3ITRAesGi xrzCn2QcLyXFA== Received: from localhost.localdomain (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) by smtpout.efficios.com (Postfix) with ESMTPSA id 4QBbnv0Lflz11wY; Wed, 3 May 2023 21:29:23 -0400 (EDT) From: Mathieu Desnoyers To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Mathieu Desnoyers , Boqun Feng , Steven Rostedt , Joel Fernandes , "Paul E. McKenney" , Josh Triplett , Lai Jiangshan , Zqiang Subject: [RFC PATCH 1/4] rcu: rcupdate.h: Add missing parentheses around macro pointer dereference Date: Wed, 3 May 2023 21:29:11 -0400 Message-Id: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764925364823276193?= X-GMAIL-MSGID: =?utf-8?q?1764925364823276193?= linux/rcupdate.h macros use the *p parameter without parentheses, e.g.: typeof(*p) rather than typeof(*(p)) The following test-case shows how it can generate confusion due to C operator precedence being reversed compared to the expectations: #define m(p) \ do { \ __typeof__(*p) v = 0; \ } while (0) void fct(unsigned long long *p1) { m(p1 + 1); /* works */ m(1 + p1); /* broken */ } Signed-off-by: Mathieu Desnoyers Reviewed-by: Boqun Feng Reviewed-by: Steven Rostedt Reviewed-by: Joel Fernandes (Google) Cc: "Paul E. McKenney" Cc: Joel Fernandes Cc: Josh Triplett Cc: Boqun Feng Cc: Steven Rostedt Cc: Lai Jiangshan Cc: Zqiang --- include/linux/rcupdate.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index dcd2cf1e8326..38e84f3d515e 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -430,16 +430,16 @@ static inline void rcu_preempt_sleep_check(void) { } #ifdef __CHECKER__ #define rcu_check_sparse(p, space) \ - ((void)(((typeof(*p) space *)p) == p)) + ((void)(((typeof(*(p)) space *)(p)) == (p))) #else /* #ifdef __CHECKER__ */ #define rcu_check_sparse(p, space) #endif /* #else #ifdef __CHECKER__ */ #define __unrcu_pointer(p, local) \ ({ \ - typeof(*p) *local = (typeof(*p) *__force)(p); \ + typeof(*(p)) *local = (typeof(*(p)) *__force)(p); \ rcu_check_sparse(p, __rcu); \ - ((typeof(*p) __force __kernel *)(local)); \ + ((typeof(*(p)) __force __kernel *)(local)); \ }) /** * unrcu_pointer - mark a pointer as not being RCU protected @@ -452,29 +452,29 @@ static inline void rcu_preempt_sleep_check(void) { } #define __rcu_access_pointer(p, local, space) \ ({ \ - typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \ + typeof(*(p)) *local = (typeof(*(p)) *__force)READ_ONCE(p); \ rcu_check_sparse(p, space); \ - ((typeof(*p) __force __kernel *)(local)); \ + ((typeof(*(p)) __force __kernel *)(local)); \ }) #define __rcu_dereference_check(p, local, c, space) \ ({ \ /* Dependency order vs. p above. */ \ - typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \ + typeof(*(p)) *local = (typeof(*(p)) *__force)READ_ONCE(p); \ RCU_LOCKDEP_WARN(!(c), "suspicious rcu_dereference_check() usage"); \ rcu_check_sparse(p, space); \ - ((typeof(*p) __force __kernel *)(local)); \ + ((typeof(*(p)) __force __kernel *)(local)); \ }) #define __rcu_dereference_protected(p, local, c, space) \ ({ \ RCU_LOCKDEP_WARN(!(c), "suspicious rcu_dereference_protected() usage"); \ rcu_check_sparse(p, space); \ - ((typeof(*p) __force __kernel *)(p)); \ + ((typeof(*(p)) __force __kernel *)(p)); \ }) #define __rcu_dereference_raw(p, local) \ ({ \ /* Dependency order vs. p above. */ \ typeof(p) local = READ_ONCE(p); \ - ((typeof(*p) __force __kernel *)(local)); \ + ((typeof(*(p)) __force __kernel *)(local)); \ }) #define rcu_dereference_raw(p) __rcu_dereference_raw(p, __UNIQUE_ID(rcu)) From patchwork Thu May 4 01:29:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 89894 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1732626vqo; Wed, 3 May 2023 18:34:11 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7Zay7aN0MNs6AzKAt0yyZ0Oct5YNmhcC6blrP1TD9muzixU+3Df+7erlckSGsF87JjIr8Y X-Received: by 2002:a05:6a21:164d:b0:ef:e240:b562 with SMTP id no13-20020a056a21164d00b000efe240b562mr551090pzb.39.1683164051203; Wed, 03 May 2023 18:34:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683164051; cv=none; d=google.com; s=arc-20160816; b=pwFI4pqXNUP1XBeNtgz5/5z6SlUACGJiZCTVIphHeR7rfJTvtqUcK++weSkchn1LoH 1XNk7EjwXBSAyf3kDLgVgKRrzc/9jqBY0I9MlvqNtImBEOUi88+Fqsw3RIDhioegLM+U TWu4TBoeaXGEdaEE591FmRfOymZ5iP7yCbWRfbOQkAre7H/Id0IctmsaXoehNrzj7A9o 1vNaOptzFoUTLzWaymVTf7LNlY0suWYHX3QSCJ6dz5HmlCm9yMzNcPD2RSVlK0LMj5kK 1n8QG8XoryvhEQchmm9hAtcVGtxPXdyE9721bdwFVqqMw12zG5Y4CtQssMsCXhA3M8y6 AJOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZpRdX3pjGD4Y1NS5ED7Si6WNWyiH/n1sEa9Rq49nEJk=; b=uEKWV6JurqBn8jZ7oTa+HQ4Y2XdE32NA0yElZm923+gnljYszgYZy/nsEAkLpWV+9Y 3pJH2jyFwv2ozCjjIk9TcaKvdTmjWVrP+93qtByo/zK31E8z3vA/AEGHb7bAWVgygLYO wifldDkaN1/EZnJwvKkpiNq+uWB+TQBd2ieDJSacY1m8QWOW5WW21VCqzqif/p8uBIpe vTYDqadPabZUqLRAGpocZd36+r8YoTyGq65+p40mtGlrixOMTuLM4WhqCE7dBoTLkWJd 4YeNLOvTnSpy5Wf7NbRLAAxbiqkCDUn5xqLMTJNkKAWLLa8kV78inIGvYr/pJJKwLwkj dM7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b="c/6o2yyN"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d24-20020a63ed18000000b00528ca114e67si13639200pgi.898.2023.05.03.18.33.58; Wed, 03 May 2023 18:34:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b="c/6o2yyN"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229738AbjEDB3b (ORCPT + 99 others); Wed, 3 May 2023 21:29:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229649AbjEDB30 (ORCPT ); Wed, 3 May 2023 21:29:26 -0400 Received: from smtpout.efficios.com (unknown [IPv6:2607:5300:203:b2ee::31e5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 47FA510E3 for ; Wed, 3 May 2023 18:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=efficios.com; s=smtpout1; t=1683163763; bh=xB/tbUL0jvzBmqb1y5siBAjKU4LpKYvAX7mWm/Dgchw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c/6o2yyNUb/1IFUzVJxvYBBjHX9GfLYUAMWLVltW/xN1/+i6zyhqsBZsZL3JrDG9E GTZdh5NDXTCfd1e67k2BI68chguJyd23TeE5Kxk2zmkbxu1G01EeFXR0OZxqXp8Cmz QTa183BFL61ucIwKAMzgPUmb6IYdW1YGfvEcdi+jTdRYQraDEmFxkh36mZgSPox+0i E/x48jqEAKVbPnBZrsBYt7cPK1gL7Z1HVgjT9x4LXDT7HFmkDOQAyU2hnm6qxcocir Wa22zAi+baSyFbVuDnqpwWerQ8eitMGeAp2XMooGAG1ldih8GsNzFU6qnaZLsl54sX onFABl9zx9KTw== Received: from localhost.localdomain (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) by smtpout.efficios.com (Postfix) with ESMTPSA id 4QBbnv2Gjrz11ff; Wed, 3 May 2023 21:29:23 -0400 (EDT) From: Mathieu Desnoyers To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Mathieu Desnoyers , Greg Kroah-Hartman , Andy Shevchenko , David Howells , Ricardo Martinez Subject: [RFC PATCH 2/4] list.h: Fix parentheses around macro pointer parameter use Date: Wed, 3 May 2023 21:29:12 -0400 Message-Id: <20230504012914.1797355-2-mathieu.desnoyers@efficios.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> References: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RDNS_NONE,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764925428265875194?= X-GMAIL-MSGID: =?utf-8?q?1764925428265875194?= Add missing parentheses around use of macro argument "pos" in those patterns to ensure operator precedence behaves as expected: - typeof(*pos) - pos->member Remove useless parentheses around use of macro parameter (head) in the following pattern: - list_is_head(pos, (head)) Because comma is the lowest priority operator already, so the extra pair of parentheses is redundant. This corrects the following usage pattern where operator precedence is unexpected: LIST_HEAD(testlist); struct test { struct list_head node; int a; }; // pos->member issue void f(void) { struct test *t1; struct test **t2 = &t1; list_for_each_entry((*t2), &testlist, node) { /* works */ //... } list_for_each_entry(*t2, &testlist, node) { /* broken */ //... } } // typeof(*pos) issue void f2(void) { struct test *t1 = NULL, *t2; t2 = list_prepare_entry((0 + t1), &testlist, node); /* works */ t2 = list_prepare_entry(0 + t1, &testlist, node); /* broken */ } Note that the macros in which "pos" is also used as an lvalue probably don't suffer from the lack of parentheses around "pos" in typeof(*pos), but add those nevertheless to keep everything consistent. Signed-off-by: Mathieu Desnoyers Cc: Andrew Morton Cc: Greg Kroah-Hartman Cc: Andy Shevchenko Cc: David Howells Cc: Ricardo Martinez --- include/linux/list.h | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/include/linux/list.h b/include/linux/list.h index f10344dbad4d..bb106238eaf6 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -603,7 +603,7 @@ static inline void list_splice_tail_init(struct list_head *list, * @head: the head for your list. */ #define list_for_each(pos, head) \ - for (pos = (head)->next; !list_is_head(pos, (head)); pos = pos->next) + for (pos = (head)->next; !list_is_head(pos, head); pos = (pos)->next) /** * list_for_each_rcu - Iterate over a list in an RCU-safe fashion @@ -612,8 +612,8 @@ static inline void list_splice_tail_init(struct list_head *list, */ #define list_for_each_rcu(pos, head) \ for (pos = rcu_dereference((head)->next); \ - !list_is_head(pos, (head)); \ - pos = rcu_dereference(pos->next)) + !list_is_head(pos, head); \ + pos = rcu_dereference((pos)->next)) /** * list_for_each_continue - continue iteration over a list @@ -623,7 +623,7 @@ static inline void list_splice_tail_init(struct list_head *list, * Continue to iterate over a list, continuing after the current position. */ #define list_for_each_continue(pos, head) \ - for (pos = pos->next; !list_is_head(pos, (head)); pos = pos->next) + for (pos = (pos)->next; !list_is_head(pos, head); pos = (pos)->next) /** * list_for_each_prev - iterate over a list backwards @@ -631,7 +631,7 @@ static inline void list_splice_tail_init(struct list_head *list, * @head: the head for your list. */ #define list_for_each_prev(pos, head) \ - for (pos = (head)->prev; !list_is_head(pos, (head)); pos = pos->prev) + for (pos = (head)->prev; !list_is_head(pos, head); pos = (pos)->prev) /** * list_for_each_safe - iterate over a list safe against removal of list entry @@ -640,9 +640,9 @@ static inline void list_splice_tail_init(struct list_head *list, * @head: the head for your list. */ #define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; \ - !list_is_head(pos, (head)); \ - pos = n, n = pos->next) + for (pos = (head)->next, n = (pos)->next; \ + !list_is_head(pos, head); \ + pos = n, n = (pos)->next) /** * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry @@ -651,9 +651,9 @@ static inline void list_splice_tail_init(struct list_head *list, * @head: the head for your list. */ #define list_for_each_prev_safe(pos, n, head) \ - for (pos = (head)->prev, n = pos->prev; \ - !list_is_head(pos, (head)); \ - pos = n, n = pos->prev) + for (pos = (head)->prev, n = (pos)->prev; \ + !list_is_head(pos, head); \ + pos = n, n = (pos)->prev) /** * list_count_nodes - count nodes in the list @@ -677,7 +677,7 @@ static inline size_t list_count_nodes(struct list_head *head) * @member: the name of the list_head within the struct. */ #define list_entry_is_head(pos, head, member) \ - (&pos->member == (head)) + (&(pos)->member == (head)) /** * list_for_each_entry - iterate over list of given type @@ -686,7 +686,7 @@ static inline size_t list_count_nodes(struct list_head *head) * @member: the name of the list_head within the struct. */ #define list_for_each_entry(pos, head, member) \ - for (pos = list_first_entry(head, typeof(*pos), member); \ + for (pos = list_first_entry(head, typeof(*(pos)), member); \ !list_entry_is_head(pos, head, member); \ pos = list_next_entry(pos, member)) @@ -697,7 +697,7 @@ static inline size_t list_count_nodes(struct list_head *head) * @member: the name of the list_head within the struct. */ #define list_for_each_entry_reverse(pos, head, member) \ - for (pos = list_last_entry(head, typeof(*pos), member); \ + for (pos = list_last_entry(head, typeof(*(pos)), member); \ !list_entry_is_head(pos, head, member); \ pos = list_prev_entry(pos, member)) @@ -710,7 +710,7 @@ static inline size_t list_count_nodes(struct list_head *head) * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). */ #define list_prepare_entry(pos, head, member) \ - ((pos) ? : list_entry(head, typeof(*pos), member)) + ((pos) ? : list_entry(head, typeof(*(pos)), member)) /** * list_for_each_entry_continue - continue iteration over list of given type @@ -773,7 +773,7 @@ static inline size_t list_count_nodes(struct list_head *head) * @member: the name of the list_head within the struct. */ #define list_for_each_entry_safe(pos, n, head, member) \ - for (pos = list_first_entry(head, typeof(*pos), member), \ + for (pos = list_first_entry(head, typeof(*(pos)), member), \ n = list_next_entry(pos, member); \ !list_entry_is_head(pos, head, member); \ pos = n, n = list_next_entry(n, member)) @@ -820,7 +820,7 @@ static inline size_t list_count_nodes(struct list_head *head) * of list entry. */ #define list_for_each_entry_safe_reverse(pos, n, head, member) \ - for (pos = list_last_entry(head, typeof(*pos), member), \ + for (pos = list_last_entry(head, typeof(*(pos)), member), \ n = list_prev_entry(pos, member); \ !list_entry_is_head(pos, head, member); \ pos = n, n = list_prev_entry(n, member)) @@ -1033,10 +1033,10 @@ static inline void hlist_move_list(struct hlist_head *old, #define hlist_entry(ptr, type, member) container_of(ptr,type,member) #define hlist_for_each(pos, head) \ - for (pos = (head)->first; pos ; pos = pos->next) + for (pos = (head)->first; pos ; pos = (pos)->next) #define hlist_for_each_safe(pos, n, head) \ - for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ + for (pos = (head)->first; pos && ({ n = (pos)->next; 1; }); \ pos = n) #define hlist_entry_safe(ptr, type, member) \ @@ -1082,8 +1082,8 @@ static inline void hlist_move_list(struct hlist_head *old, * @member: the name of the hlist_node within the struct. */ #define hlist_for_each_entry_safe(pos, n, head, member) \ - for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ - pos && ({ n = pos->member.next; 1; }); \ - pos = hlist_entry_safe(n, typeof(*pos), member)) + for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ + pos && ({ n = (pos)->member.next; 1; }); \ + pos = hlist_entry_safe(n, typeof(*(pos)), member)) #endif From patchwork Thu May 4 01:29:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 89895 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1736344vqo; Wed, 3 May 2023 18:44:45 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6a2Ij2NSyzF9tGdGGg17P8XiyVrN8rs9msSPT50sUsAzWr75SB0DAbCS2lStcNm6ryQI7c X-Received: by 2002:a05:6a21:3408:b0:f3:ac88:c048 with SMTP id yn8-20020a056a21340800b000f3ac88c048mr643737pzb.7.1683164685147; Wed, 03 May 2023 18:44:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683164685; cv=none; d=google.com; s=arc-20160816; b=A/qbjjYaSsPn4iN1OpTVXiDpTf6fmPQmtYEa9K/i5g0O7q560ov2osSjXrLeCNGDYR Wk680zS0EwfSYmrjgY+AsntaehfAo4aHe2BnaLS3Kptw/Zls3CGx05Uvpj45u3rZo6DZ kePKZYs4trqxzHlViC6wyTxTnrEklULdmLNlnL21i8XWrwAAEM1ZHosgmnXW+9CU/cfW BvUeMQ4QOmsqQh9OBC75ksfjRPKOi2WOxJkA6wMW+V3vlsBrNYJFleA8vDg2bSRPgyo8 TiJSvgYm19IcG5ZX1TtZoSIg+BNLvH/wm0+4IizWc2udwOQcymVqcQKoiDTT7nVKKMGG TeXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Zti40A3E9W1uH526WPtZKO9ZOi9tS1JUTyb1/r8Eh9U=; b=043WytLEQiLLcyt3aVJShTY1NMW806EUiTkJ8KKS5dmZPo1PpY/fLhGy2Bntkt98m9 0W+RD58am0k6HvTbguclkiOkbzTlkcv3VF0tXCZ26IuqQQ4f/k+TLIeeCHZAk2yY0vSh 67/shcHGBmnXKSIDmpdYZpSRQsS27Q8hLC7aPjEnTjqC23Kkq5cBbRlxMUil5zHYZ30p V1SErReabfC+UV5Mydv03+CGm5ByV//NV8gEPetvvNYUry+iOESi7gnqWmfxbqqdiN4E BhYxbFOfTFl5rPYpt/cE6sruxFEal09a56niJXiOWVpZGUwAreHcezqUou7vVZYC4HE/ aaqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b=T42eYDhU; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t11-20020a63460b000000b0051aed25131asi34168127pga.252.2023.05.03.18.44.30; Wed, 03 May 2023 18:44:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b=T42eYDhU; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229441AbjEDB3d (ORCPT + 99 others); Wed, 3 May 2023 21:29:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229656AbjEDB30 (ORCPT ); Wed, 3 May 2023 21:29:26 -0400 Received: from smtpout.efficios.com (unknown [IPv6:2607:5300:203:b2ee::31e5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86D0E10E6; Wed, 3 May 2023 18:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=efficios.com; s=smtpout1; t=1683163763; bh=W9zAZi8VwGgVLnwB1Kz05im9spQ0PM5+IFpjRSSrhRE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T42eYDhUFoBj8YmNOv1fempTX+rmzj0Kvxf1H0HbVMrqBzj9xxo4gQHtf/CuRapTS 04p4EEjGMlIjD0hjdETsMjkhk7SUe+MtKiIgWDqLgXPcSH9ydsw3oJ2BgNGOlyEcRq ejvpyd1ZoSsoo+k+wYPFOkdRbG2zXBt9tUSrbwD820ewxxck7mM0jv9/ABCtL0rt0T iH81xezNZmomF+nSqlqibjIM8Dn1REJPeRsQu25xk9IMZcFo6fCCQo5Tez7Gxe9Cbc oI+3G8MePWonSe3mimYuvV6cPyij7BAaFnyb1EZbF/PdPtuWyM2QbTI2Hgr9yhhmAB tDDYa4vw0WCsw== Received: from localhost.localdomain (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) by smtpout.efficios.com (Postfix) with ESMTPSA id 4QBbnv3vlyz11nL; Wed, 3 May 2023 21:29:23 -0400 (EDT) From: Mathieu Desnoyers To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Mathieu Desnoyers , "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Josh Triplett , Boqun Feng , Steven Rostedt , Lai Jiangshan , Zqiang , rcu@vger.kernel.org Subject: [RFC PATCH 3/4] rculist.h: Fix parentheses around macro pointer parameter use Date: Wed, 3 May 2023 21:29:13 -0400 Message-Id: <20230504012914.1797355-3-mathieu.desnoyers@efficios.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> References: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RDNS_NONE,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764926092714439470?= X-GMAIL-MSGID: =?utf-8?q?1764926092714439470?= Add missing parentheses around use of macro argument "pos" in those patterns to ensure operator precedence behaves as expected: - typeof(*pos) - pos->member This corrects the following usage pattern where operator precedence is unexpected: LIST_HEAD(testlist); struct test { struct list_head node; int a; }; // pos->member issue void f(void) { struct test *t1; struct test **t2 = &t1; list_for_each_entry_rcu((*t2), &testlist, node) { /* works */ //... } list_for_each_entry_rcu(*t2, &testlist, node) { /* broken */ //... } } The typeof(*pos) lack of parentheses around "pos" is not an issue per se in the specific macros modified here because "pos" is used as an lvalue, which should prevent use of any operator causing issue. Still add the extra parentheses for consistency. Signed-off-by: Mathieu Desnoyers Cc: "Paul E. McKenney" Cc: Andrew Morton Cc: Frederic Weisbecker Cc: Neeraj Upadhyay Cc: Joel Fernandes Cc: Josh Triplett Cc: Boqun Feng Cc: Steven Rostedt Cc: Lai Jiangshan Cc: Zqiang Cc: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org Acked-by: Steven Rostedt (Google) --- include/linux/rculist.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/include/linux/rculist.h b/include/linux/rculist.h index d29740be4833..d27aeff5447d 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -388,9 +388,9 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, */ #define list_for_each_entry_rcu(pos, head, member, cond...) \ for (__list_check_rcu(dummy, ## cond, 0), \ - pos = list_entry_rcu((head)->next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry_rcu(pos->member.next, typeof(*pos), member)) + pos = list_entry_rcu((head)->next, typeof(*(pos)), member);\ + &(pos)->member != (head); \ + pos = list_entry_rcu((pos)->member.next, typeof(*(pos)), member)) /** * list_for_each_entry_srcu - iterate over rcu list of given type @@ -407,9 +407,9 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, */ #define list_for_each_entry_srcu(pos, head, member, cond) \ for (__list_check_srcu(cond), \ - pos = list_entry_rcu((head)->next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry_rcu(pos->member.next, typeof(*pos), member)) + pos = list_entry_rcu((head)->next, typeof(*(pos)), member);\ + &(pos)->member != (head); \ + pos = list_entry_rcu((pos)->member.next, typeof(*(pos)), member)) /** * list_entry_lockless - get the struct for this entry @@ -441,9 +441,9 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, * but never deleted. */ #define list_for_each_entry_lockless(pos, head, member) \ - for (pos = list_entry_lockless((head)->next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry_lockless(pos->member.next, typeof(*pos), member)) + for (pos = list_entry_lockless((head)->next, typeof(*(pos)), member); \ + &(pos)->member != (head); \ + pos = list_entry_lockless((pos)->member.next, typeof(*(pos)), member)) /** * list_for_each_entry_continue_rcu - continue iteration over list of given type @@ -464,9 +464,9 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, * position. */ #define list_for_each_entry_continue_rcu(pos, head, member) \ - for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry_rcu(pos->member.next, typeof(*pos), member)) + for (pos = list_entry_rcu((pos)->member.next, typeof(*(pos)), member); \ + &(pos)->member != (head); \ + pos = list_entry_rcu((pos)->member.next, typeof(*(pos)), member)) /** * list_for_each_entry_from_rcu - iterate over a list from current point @@ -486,8 +486,8 @@ static inline void list_splice_tail_init_rcu(struct list_head *list, * after the given position. */ #define list_for_each_entry_from_rcu(pos, head, member) \ - for (; &(pos)->member != (head); \ - pos = list_entry_rcu(pos->member.next, typeof(*(pos)), member)) + for (; &(pos)->member != (head); \ + pos = list_entry_rcu((pos)->member.next, typeof(*(pos)), member)) /** * hlist_del_rcu - deletes entry from hash list without re-initialization From patchwork Thu May 4 01:29:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 89896 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1736343vqo; Wed, 3 May 2023 18:44:45 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7C/DgnslIDhkmBwNQjo8Z6MrDZ7dtta/wq4VMv+Bx2o+JKhN1KWBu1TWiM35S7Vx2YaMRT X-Received: by 2002:a17:903:2352:b0:1ab:109e:a553 with SMTP id c18-20020a170903235200b001ab109ea553mr2368592plh.62.1683164685078; Wed, 03 May 2023 18:44:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683164685; cv=none; d=google.com; s=arc-20160816; b=sc2H3LLqNff+fKo5ZwYjN8zxOXDwuUJTYG2NDl2hIrW6amy2yJM6JA4GwystG0S14K 3ESjhURglDMJlsyM4zO99d75n2RS3DvylcU3yRrH/PuAoMrRr3ZdgMepTsuhZTyd2BAv RCseI9Xei/USaEc1Lg0eC9C689gCsj7Ybo0O1WzC0CPrSGOsLAqUZobD+wLUPtiXChCF ZSSl2cqMQGjFjb1dQLQjKrwAnzz4ZKvfOlw3pJsPguxxvepXzP+cLLYap4EyJ3zHUR8t +Kq6XeqCfob4L/xet12zV/uh2ry7+c/yoBmaqOYpWeH35Okjltl2Wkb1mHioL2nPwKen CqXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=mnR4vQgg+RwzAFnIUVvJaE+kou6tSnm7Sdnxo2/8WVs=; b=e2f9hBSXBPmGkCnkqjzWd4bkSUkzWKZjtF1CNjc3R04EOeWaFv5yy1M5TtX2/t6X8T OtyWfVEuNbYeVoBSUYiTzTnNpfGCc3zRObZw+GS3NtweEl3e1t/nEiVWMhs4eXBexw0p Z80RSZZbkxpaA6+xGymzz1RWa5Fh28N2UPVfAUg7Qlbqzlxu4o5r5ixjUOqjfpfwX3q6 uVhSHsznFJwoZPXvCHAWIKtBGTao/xZdZXs+NU5JBu06qhlCcVxSAitHK/OBwDI7gb5h 07CxvmlQjcsclso0yigisAGzcyU50sY/jrcxND26XP6KEI93ZHMs91aQ6zKtF2w5uL5o 8N3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b=xuygN5Uk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j9-20020a170903024900b001a63ba2c894si36268225plh.548.2023.05.03.18.44.20; Wed, 03 May 2023 18:44:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@efficios.com header.s=smtpout1 header.b=xuygN5Uk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=efficios.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229761AbjEDB3g (ORCPT + 99 others); Wed, 3 May 2023 21:29:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229660AbjEDB30 (ORCPT ); Wed, 3 May 2023 21:29:26 -0400 Received: from smtpout.efficios.com (smtpout.efficios.com [167.114.26.122]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BADD510F4 for ; Wed, 3 May 2023 18:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=efficios.com; s=smtpout1; t=1683163763; bh=ChUVnmTcKYnskiJX03Msq+VaqE0BCYSG0uVoH9Ivm5k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xuygN5Uk+Hvtln/jqZyQY5taMTYykXzZu7+wCO+uCyRbm0ZIuMmTTsY20OVKDcLlr 7fbMY8KxL3WB1WB5t0XoAP1KqH8RHZ5SxcGGhliMmFNn3kNi9FhgbblkCKmHU3pJRC Gm/5Uwj5Jquo7VWNULpF5BoBXA0A87/18pKeg19+eujMsfwNCA0/1L1ftETPKCAz/D rcUu3Sx3wyV2j7molHKbwRfMP1RL9XksCsg9vCtwDNUzkZAfFvnMcUeZTKP4bbTIEa IoaMbjSuW/wHXNbJy523mfiqu4kky5EJ20UvlzlBgj/i1y/NMQ5zV0Y9OTymCeO6oV EFlybCFs2SS+A== Received: from localhost.localdomain (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) by smtpout.efficios.com (Postfix) with ESMTPSA id 4QBbnv61Kbz11fg; Wed, 3 May 2023 21:29:23 -0400 (EDT) From: Mathieu Desnoyers To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Mathieu Desnoyers , Huang Ying , Peter Zijlstra Subject: [RFC PATCH 4/4] llist.h: Fix parentheses around macro pointer parameter use Date: Wed, 3 May 2023 21:29:14 -0400 Message-Id: <20230504012914.1797355-4-mathieu.desnoyers@efficios.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> References: <20230504012914.1797355-1-mathieu.desnoyers@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764926092550666915?= X-GMAIL-MSGID: =?utf-8?q?1764926092550666915?= Add missing parentheses around use of macro argument "pos" in those patterns to ensure operator precedence behaves as expected: - typeof(*pos) - pos->member The typeof(*pos) lack of parentheses around "pos" is not an issue per se in the specific macros modified here because "pos" is used as an lvalue, which should prevent use of any operator causing issue. Still add the extra parentheses for consistency. Remove useless parentheses around use of macro parameter (node) in the following pattern: llist_entry((node), typeof(*pos), member) Because comma is the lowest priority operator already, so the extra pair of parentheses is redundant. Signed-off-by: Mathieu Desnoyers Cc: Andrew Morton Cc: Huang Ying Cc: Peter Zijlstra --- include/linux/llist.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/llist.h b/include/linux/llist.h index 85bda2d02d65..45d358c15d0d 100644 --- a/include/linux/llist.h +++ b/include/linux/llist.h @@ -173,9 +173,9 @@ static inline void init_llist_head(struct llist_head *list) * reverse the order by yourself before traversing. */ #define llist_for_each_entry_safe(pos, n, node, member) \ - for (pos = llist_entry((node), typeof(*pos), member); \ + for (pos = llist_entry(node, typeof(*(pos)), member); \ member_address_is_nonnull(pos, member) && \ - (n = llist_entry(pos->member.next, typeof(*n), member), true); \ + (n = llist_entry((pos)->member.next, typeof(*(n)), member), true); \ pos = n) /**