From patchwork Mon Jan 23 18:53:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Sidwell X-Patchwork-Id: 718726 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3v6gSS0jWwz9s2G for ; Tue, 24 Jan 2017 05:53:27 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="CHpHvkhp"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=Cr856uEi/pYj/I/csgTwt14+iTLa9ELyxVSdpKByzqAmk3gKvT mnqJlC+/rdUDSwfpcRrU23C/3wBJQaqILtZNRTssY41B55w3Z20G4XAQlTPQS8X1 gy7/AKlbqXPKJwE2Utvc84bIHaMeQt9AKsDMPpnR/FnUgze+jPqcgpcoQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=ZvzY04wLr4De905NLRPTErcDz/Q=; b=CHpHvkhpQxVsGcwDRgIr SD8iCRE/j46gBUzP8pu1nGTGIN+Adw1693PZ3WI1RDoO8EwXURS9g9g2++YGRUeq OFGTYXgjxJoqAHncK3J17UsgUN53sj79U0/+mNhZ10Qz34ykJ66EYGKbf9nsn3sw a6AW8hiI3bsvMHFZjufqOPI= Received: (qmail 99020 invoked by alias); 23 Jan 2017 18:53:17 -0000 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 Received: (qmail 99010 invoked by uid 89); 23 Jan 2017 18:53:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=bg, fed, nathan@acm.org, nathanacmorg X-HELO: mail-yb0-f194.google.com Received: from mail-yb0-f194.google.com (HELO mail-yb0-f194.google.com) (209.85.213.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 23 Jan 2017 18:53:07 +0000 Received: by mail-yb0-f194.google.com with SMTP id j82so6326387ybg.2 for ; Mon, 23 Jan 2017 10:53:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:to:cc:from:subject:message-id:date :user-agent:mime-version; bh=qODZ/F8vPl5pJb//9Tyu5kYaAGlt9HzO0gn7Xij3UC4=; b=IOu0wYFZfstBW7sOAAFOpC+T1nDMEDxsXuKXINVXRZCYrLDLgsDcgJkjG7WysTTS36 M8GJzfmp/hSBBZmQd1ICTUI0GKzW51QCgl/2RGWu/ySYUmFUKDI8nteDVDCuK0gdTYBD MpOhDlXz4Zm8vmP8hNOKYSiBPhibe//J7gzPA6XXkNl/BXhukA8aMMyvds/Kr3ebJ7Lr C/EzKloU2/N3kZRZz3GpVrFkc8Yhf/Qwh+Gup6YLUeKc3QpAvVwHdTSJjusdQxnWlNCF rF9EFL1XWBSLPlfJFho6XZUnLs2VhF3SQ7Tx2sQzEQ1QuuQhcK38UzNd/sP5BYd18IJk iivQ== X-Gm-Message-State: AIkVDXICDmpebzRuWI3B4opK1Tr89bBtBAblRV9aoSlGEst9PonrpXmL7B2lVVm9uTuvrw== X-Received: by 10.37.228.197 with SMTP id b188mr20908886ybh.195.1485197585596; Mon, 23 Jan 2017 10:53:05 -0800 (PST) Received: from ?IPv6:2620:10d:c0a3:20fb:f6d0:5ac5:64cd:f102? ([2620:10d:c091:200::9:7c73]) by smtp.googlemail.com with ESMTPSA id z37sm8548708ywj.39.2017.01.23.10.53.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 23 Jan 2017 10:53:04 -0800 (PST) To: Jason Merrill Cc: GCC Patches From: Nathan Sidwell Subject: [C++ PATCH] 71406, 77508 scoped template_ids Message-ID: <35b307f2-6696-aa94-c98c-fda6d0dab9cb@acm.org> Date: Mon, 23 Jan 2017 13:53:02 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 This patch fixes 71406 and 77508, which are both ICEs dealing with 'X::Foo<...>'. finish_class_member_access_expr wasn't prepared to handle SCOPE_REF (TEMPLATE_ID_EXPR (...)), which is what it was being fed. Fixed by moving the SCOPE_REF splitting to before the TEMPLATE_ID_EXPR handling, but leaving the scope checking where it was. ok? nathan 2017-01-23 Nathan Sidwell PR c++/71406 - ICE with scope-ref'd template id exprs PR c++/77508 * typeck.c (finish_class_member_access_expr): Break up SCOPE_REF before breaking up TEMPLATE_ID_EXPR. PR c++/71406 PR c++/77508 * g++.dg/template/pr71406.C: New. Index: cp/typeck.c =================================================================== --- cp/typeck.c (revision 244819) +++ cp/typeck.c (working copy) @@ -2730,19 +2730,9 @@ finish_class_member_access_expr (cp_expr { bool is_template_id = false; tree template_args = NULL_TREE; - tree scope; + tree scope = NULL_TREE; - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - is_template_id = true; - template_args = TREE_OPERAND (name, 1); - name = TREE_OPERAND (name, 0); - - if (TREE_CODE (name) == OVERLOAD) - name = DECL_NAME (get_first_fn (name)); - else if (DECL_P (name)) - name = DECL_NAME (name); - } + access_path = object_type; if (TREE_CODE (name) == SCOPE_REF) { @@ -2761,9 +2751,25 @@ finish_class_member_access_expr (cp_expr scope, name, object_type); return error_mark_node; } + } + + if (TREE_CODE (name) == TEMPLATE_ID_EXPR) + { + is_template_id = true; + template_args = TREE_OPERAND (name, 1); + name = TREE_OPERAND (name, 0); + if (TREE_CODE (name) == OVERLOAD) + name = DECL_NAME (get_first_fn (name)); + else if (DECL_P (name)) + name = DECL_NAME (name); + } + + if (scope) + { if (TREE_CODE (scope) == ENUMERAL_TYPE) { + gcc_assert (!is_template_id); /* Looking up a member enumerator (c++/56793). */ if (!TYPE_CLASS_SCOPE_P (scope) || !DERIVED_FROM_P (TYPE_CONTEXT (scope), object_type)) @@ -2812,11 +2818,6 @@ finish_class_member_access_expr (cp_expr return error_mark_node; } } - else - { - scope = NULL_TREE; - access_path = object_type; - } if (TREE_CODE (name) == BIT_NOT_EXPR) { Index: testsuite/g++.dg/template/pr71406.C =================================================================== --- testsuite/g++.dg/template/pr71406.C (revision 0) +++ testsuite/g++.dg/template/pr71406.C (working copy) @@ -0,0 +1,28 @@ +// { dg-do compile } +// PR c++/71406 ICE with X::template Name + +template < typename T > +struct C : T +{ + void foo () { this->C::template bar <>; } +}; + +template < typename T > +struct A +{ + template < void (T::*Fn) () > void f () {} +}; + +template < typename T > struct B : A < B < T > > +{ + void g () + { + this->B::template f < &B < T >::g > (); + } +}; + +void Foo () +{ + B < int > b; + b.g (); +}