From patchwork Fri Dec 24 00:31:57 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 76559 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id A0F63B70D6 for ; Fri, 24 Dec 2010 11:32:08 +1100 (EST) Received: (qmail 10458 invoked by alias); 24 Dec 2010 00:32:07 -0000 Received: (qmail 10450 invoked by uid 22791); 24 Dec 2010 00:32:06 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com) (74.125.82.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 24 Dec 2010 00:32:00 +0000 Received: by wwi18 with SMTP id 18so6714510wwi.2 for ; Thu, 23 Dec 2010 16:31:58 -0800 (PST) MIME-Version: 1.0 Received: by 10.216.16.21 with SMTP id g21mr524186weg.6.1293150717766; Thu, 23 Dec 2010 16:31:57 -0800 (PST) Received: by 10.216.160.131 with HTTP; Thu, 23 Dec 2010 16:31:57 -0800 (PST) Date: Fri, 24 Dec 2010 00:31:57 +0000 Message-ID: Subject: PING: [patch] fix c++/18016 - warn about self-initialization in constructor init-list From: Jonathan Wakely To: gcc-patches Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Merry Pingmas, one and all. On 21 December 2010 15:25, Jonathan Wakely wrote: > Here's my attempt to fix PR c++/18016 so that we get a warning from > > struct S { >  int i; >  S() : i(i) { } > }; > > -Winit-self is broken for C++ (PR c++/34772) so I made this warn with > -Wuninitialized.  If you want to suppress the warning just don't put a > mem-initializer in the constructor (which will work at least until > someone fixes PR c++/2972) > > cp/ChangeLog: > >        PR c++/18016 >        * init.c (perform_member_init): Check for self-initialization. > > > testsuite/ChangeLog: > >        PR c++/18016 >        * g++.dg/warn/pr18016.C: New. > > > tested x86_64-linux with no regressions, ok for trunk? > Index: cp/init.c =================================================================== --- cp/init.c (revision 168023) +++ cp/init.c (working copy) @@ -449,6 +449,17 @@ perform_member_init (tree member, tree i if (decl == error_mark_node) return; + if (warn_uninitialized && init && TREE_CODE (init) == TREE_LIST + && TREE_CHAIN (init) == NULL_TREE) + { + tree val = TREE_VALUE (init); + if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member + && TREE_OPERAND (val, 0) == current_class_ref) + warning_at (DECL_SOURCE_LOCATION (current_function_decl), + OPT_Wuninitialized, "%qD is initialized with itself", + member); + } + if (init == void_type_node) { /* mem() means value-initialization. */ Index: testsuite/g++.dg/warn/pr18016.C =================================================================== --- testsuite/g++.dg/warn/pr18016.C (revision 0) +++ testsuite/g++.dg/warn/pr18016.C (revision 0) @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized" } */ + +class X { + int i; + X() : i(i) { } // { dg-warning "initialized with itself" } + X(int i) : i(i) { } + X(const X& x) : i(x.i) { } +}; + +// { dg-prune-output "In constructor" }