From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 73979 invoked by alias); 7 Jul 2015 20:15:11 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 73966 invoked by uid 89); 7 Jul 2015 20:15:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg21.ericsson.net Received: from usevmg21.ericsson.net (HELO usevmg21.ericsson.net) (198.24.6.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Tue, 07 Jul 2015 20:15:09 +0000 Received: from EUSAAHC002.ericsson.se (Unknown_Domain [147.117.188.78]) by usevmg21.ericsson.net (Symantec Mail Security) with SMTP id E2.4D.07675.10CCB955; Tue, 7 Jul 2015 14:54:25 +0200 (CEST) Received: from [142.133.110.144] (147.117.188.8) by smtp-am.internal.ericsson.com (147.117.188.80) with Microsoft SMTP Server id 14.3.210.2; Tue, 7 Jul 2015 16:15:05 -0400 Message-ID: <559C3349.1050501@ericsson.com> Date: Tue, 07 Jul 2015 20:15:00 -0000 From: Simon Marchi User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Pedro Alves , Subject: Re: [PATCH] Remove CHECK_TYPEDEF, use check_typedef instead References: <1436213157-21480-1-git-send-email-simon.marchi@ericsson.com> <559BFB12.6050606@redhat.com> In-Reply-To: <559BFB12.6050606@redhat.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2015-07/txt/msg00191.txt.bz2 On 15-07-07 12:15 PM, Pedro Alves wrote: > I don't have a strong opinion either. Whatever's fine with others > is fine with me. > > Playing devil's advocate, the CHECK_TYPEDEF macro has the advantage > that makes it clear that you want to peel away typedefs are don't > really care about the original type. I think it's clear enough as well when you assign to the same variable as the one you pass. > I'd argue that the real issue with the macro is that it takes the > type pointer argument "by non-const reference to pointer". > > Another solution would be to make it a function/macro that > instead takes a pointer to a type pointer. Something like: > > void > CHECK_TYPEDEFS (struct type **type) > { > *type = check_typedef (*type); > } > > Then you'd write: > > > - CHECK_TYPEDEF (result); > > + CHECK_TYPEDEF (&result); > > Or even rename it while at it: > > void > peel_typedefs (struct type **type) > { > *type = check_typedef (*type); > } > > And so you'd write: > > > - CHECK_TYPEDEF (result); > > + peel_typedefs (&result); > > Then the code ends up self documenting, and there's no way to > forget to assign the return of the function back to the > argument. That's a bit better, but I don't think there's an advantage here of having two ways to do the same thing. If anything, it's confusing for new contributors. I was going to suggest adding __attribute__((warn_unused_result)) to check_typedef, as it would also prevent forgetting assigning the result. Especially if we change it, people used to the old macro would be at risk of forgetting it. However, I realized that at a few places the result of check_typedef is ignored. It is used only to initialize the length field of the typedef, so that TYPE_LENGTH (the_typedef) will return the right thing [1]. Using a side-effect of check_typedef to get the length of the type right seems very hackish and error-prone (easy to forget something or to break something when moving code around). I think there should be a get_type_length [2] function that returns what you would expect: the actual length of the type, after having peeled all layers of typedef. You wouldn't need to call check_typedef beforehand. It would be cleaner and safer, and would allow us to add warn_unused_result to check_typedef. Because there should be no reason to call check_typedef than to obtain the resolved type. Thoughts? [1] For example: https://github.com/simark/binutils-gdb/blob/master/gdb/tracepoint.c#L1532 [2] I can see a get_type_length function mentioned in the ChangeLog here: https://github.com/simark/binutils-gdb/blob/master/gdb/ChangeLog-2014#L9750 but I can't find any trace of it in the source code (even when checkout out that commit). Any idea? Joel perhaps? > Thanks, > Pedro Alves >