From patchwork Mon Jun 3 15:16:22 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 248312 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 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 9AA512C00A7 for ; Tue, 4 Jun 2013 01:16:38 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; q=dns; s=default; b=Oc+hjrmMYT6NLQf6ANaLrHp3yPcE0L+RBPOqR5nf5Lh eVVwMlMMsCrhLL0ZYCjN4SQN4CDohiTMuxP8eGQ4JKSBVtqgDGvlfzthiv7ToHaW pa3wsdnZJ1yTo2294YJJX5sT6xMvwJ5DgP8PYzybtb3WJurK+tCkzMSBjU5mOgmQ = 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 :message-id:date:from:mime-version:to:cc:subject:content-type; s=default; bh=a6NdHC0ZdHMsRrXp9fNCdgRd9m8=; b=hUrgJIO0wTLowJr2I 3YGJTnVZxx5A5t0W7gTh9elgSKPIjP8zPA3CX6ru5KNKt/dnxPrssvkxfzA13sMG bnlRYw2KVO3DtV0TsHVOEZJdkIKQqMR2KKrIu9S0KtmanpR5vHa3Qy20LuSbiu7K 1N5FdTmhcaiH94xBAmifLW4XZ8= Received: (qmail 31780 invoked by alias); 3 Jun 2013 15:16:31 -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 31769 invoked by uid 89); 3 Jun 2013 15:16:31 -0000 X-Spam-SWARE-Status: No, score=-5.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_MED, RCVD_IN_HOSTKARMA_NO, RCVD_IN_HOSTKARMA_YE, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from aserp1040.oracle.com (HELO aserp1040.oracle.com) (141.146.126.69) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Mon, 03 Jun 2013 15:16:29 +0000 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r53FGQw4014345 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Jun 2013 15:16:27 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r53FGPjI006080 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Jun 2013 15:16:25 GMT Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r53FGO7G024661; Mon, 3 Jun 2013 15:16:24 GMT Received: from poldo4.casa (/79.33.220.74) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 03 Jun 2013 08:16:24 -0700 Message-ID: <51ACB346.8030405@oracle.com> Date: Mon, 03 Jun 2013 17:16:22 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130510 Thunderbird/17.0.6 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: Jason Merrill Subject: [C++ Patch] PR 57419 X-Virus-Found: No Hi, in this SFINAE issue, finish_qualified_id_expr is called with complain == 0 and calls mark_used, which has naked error calls. The straightforward fix works well. I'm also taking the occasion to change an error to inform (then some testcases must be adjusted). Tested x86_64-linux. Thanks, Paolo. //////////////////// /gcc/cp 2013-06-03 Paolo Carlini PR c++/57419 * decl2.c (mark_used_sfinae): Add. * semantics.c (finish_qualified_id_expr): Use it. * cp-tree.h: Update. /gcc/testsuite 2013-06-03 Paolo Carlini PR c++/57419 * g++.dg/cpp0x/sfinae46.C: New. * g++.dg/cpp0x/defaulted13.C: Adjust. * g++.dg/cpp0x/defaulted2.C: Likewise. * g++.dg/cpp0x/defaulted26.C: Likewise. * g++.dg/cpp0x/defaulted3.C: Likewise. * g++.dg/cpp0x/error1.C: Likewise. * g++.dg/cpp0x/implicit1.C: Likewise. * g++.dg/cpp0x/implicit11.C: Likewise. * g++.dg/cpp0x/inh-ctor13.C: Likewise. * g++.dg/cpp0x/initlist47.C: Likewise. * g++.dg/cpp0x/initlist9.C: Likewise. * g++.dg/cpp0x/lambda/lambda-errloc.C: Likewise. * g++.dg/cpp0x/lambda/lambda-errloc2.C: Likewise. * g++.dg/cpp0x/nsdmi-local.C: Likewise. * g++.dg/cpp0x/union4.C: Likewise. * g++.dg/template/crash108.C: Likewise. * g++.dg/template/crash41.C: Likewise. * g++.old-deja/g++.jason/local.C: Likewise. * g++.old-deja/g++.law/visibility3.C: Likewise. /libstdc++-v3 2013-06-03 Paolo Carlini PR c++/57419 * testsuite/20_util/default_delete/48631_neg.cc: Adjust. Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 199607) +++ gcc/cp/cp-tree.h (working copy) @@ -5278,6 +5278,7 @@ extern bool decl_constant_var_p (tree); extern bool decl_maybe_constant_var_p (tree); extern void check_default_args (tree); extern bool mark_used (tree); +extern bool mark_used_sfinae (tree, tsubst_flags_t); extern void finish_static_data_member_decl (tree, tree, bool, tree, int); extern tree cp_build_parm_decl (tree, tree); extern tree get_guard (tree); Index: gcc/cp/decl2.c =================================================================== --- gcc/cp/decl2.c (revision 199607) +++ gcc/cp/decl2.c (working copy) @@ -4499,7 +4499,7 @@ possibly_inlined_p (tree decl) wrong, true otherwise. */ bool -mark_used (tree decl) +mark_used_sfinae (tree decl, tsubst_flags_t complain) { /* If DECL is a BASELINK for a single function, then treat it just like the DECL for the function. Otherwise, if the BASELINK is @@ -4537,9 +4537,12 @@ bool return false; } } - error ("use of deleted function %qD", decl); - if (!maybe_explain_implicit_delete (decl)) - error_at (DECL_SOURCE_LOCATION (decl), "declared here"); + if (complain & tf_error) + { + error ("use of deleted function %qD", decl); + if (!maybe_explain_implicit_delete (decl)) + inform (DECL_SOURCE_LOCATION (decl), "declared here"); + } return false; } @@ -4552,7 +4555,8 @@ bool { if (!processing_template_decl && type_uses_auto (TREE_TYPE (decl))) { - error ("use of %qD before deduction of %", decl); + if (complain & tf_error) + error ("use of %qD before deduction of %", decl); return false; } return true; @@ -4701,4 +4705,10 @@ bool return true; } +bool +mark_used (tree decl) +{ + return mark_used_sfinae (decl, tf_warning_or_error); +} + #include "gt-cp-decl2.h" Index: gcc/cp/semantics.c =================================================================== --- gcc/cp/semantics.c (revision 199607) +++ gcc/cp/semantics.c (working copy) @@ -1778,8 +1778,9 @@ finish_qualified_id_expr (tree qualifying_class, if (error_operand_p (expr)) return error_mark_node; - if (DECL_P (expr) || BASELINK_P (expr)) - mark_used (expr); + if ((DECL_P (expr) || BASELINK_P (expr)) + && !mark_used_sfinae (expr, complain)) + return error_mark_node; if (template_p) check_template_keyword (expr); Index: gcc/testsuite/g++.dg/cpp0x/defaulted13.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/defaulted13.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/defaulted13.C (working copy) @@ -7,13 +7,13 @@ struct NonCopyable { }; template<> -NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-error "declared" } +NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-message "declared" } template NonCopyable::NonCopyable(NonCopyable const&) = default; template<> -NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-error "declared" } +NonCopyable::NonCopyable(NonCopyable const&) = delete; // { dg-message "declared" } int main() Index: gcc/testsuite/g++.dg/cpp0x/defaulted2.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/defaulted2.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/defaulted2.C (working copy) @@ -42,7 +42,7 @@ struct E struct F { F() = default; - F(const F&) = delete; // { dg-error "declared" } + F(const F&) = delete; // { dg-message "declared" } }; struct G Index: gcc/testsuite/g++.dg/cpp0x/defaulted26.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/defaulted26.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/defaulted26.C (working copy) @@ -1,7 +1,7 @@ // PR c++/49066 // { dg-options -std=c++0x } -void foo() = delete; // { dg-error "declared here" } +void foo() = delete; // { dg-message "declared here" } void foo(); int main() { foo(); } // { dg-error "deleted" } Index: gcc/testsuite/g++.dg/cpp0x/defaulted3.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/defaulted3.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/defaulted3.C (working copy) @@ -4,7 +4,7 @@ template struct A { template - bool operator==(const A&) = delete; // { dg-error "declared" } + bool operator==(const A&) = delete; // { dg-message "declared" } operator bool () { return true; } }; Index: gcc/testsuite/g++.dg/cpp0x/error1.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/error1.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/error1.C (working copy) @@ -2,7 +2,7 @@ // { dg-do compile } // { dg-options "-std=c++0x" } -template void foo (int... x[N]) // { dg-error "int \\\[N\\\]\\.\\.\\. x" } +template void foo (int... x[N]) // { dg-message "int \\\[N\\\]\\.\\.\\. x" } { struct A { Index: gcc/testsuite/g++.dg/cpp0x/implicit1.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/implicit1.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/implicit1.C (working copy) @@ -15,7 +15,7 @@ D d; // { dg-error "deleted" } struct E { - ~E() = delete; // { dg-error "declared here" } + ~E() = delete; // { dg-message "declared here" } }; struct F Index: gcc/testsuite/g++.dg/cpp0x/implicit11.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/implicit11.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/implicit11.C (working copy) @@ -4,7 +4,7 @@ struct A { - ~A() = delete; // { dg-error "declared here" } + ~A() = delete; // { dg-message "declared here" } }; struct B: A { }; // { dg-error "deleted" } Index: gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C (working copy) @@ -8,7 +8,7 @@ struct A struct C { - C() = delete; // { dg-error "declared here" } + C() = delete; // { dg-message "declared here" } }; struct B: A, C Index: gcc/testsuite/g++.dg/cpp0x/initlist47.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/initlist47.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/initlist47.C (working copy) @@ -1,6 +1,6 @@ // { dg-options -std=c++0x } -struct A { ~A() = delete; }; // { dg-error "declared" } +struct A { ~A() = delete; }; // { dg-message "declared" } int main() { Index: gcc/testsuite/g++.dg/cpp0x/initlist9.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/initlist9.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/initlist9.C (working copy) @@ -8,7 +8,7 @@ struct b b() = default; ~b() = default; b& operator=(const b&) = delete; - b(const b&) = delete; // { dg-error "declared" } + b(const b&) = delete; // { dg-message "declared" } b(bool _t): t (_t) { } }; Index: gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C (working copy) @@ -5,7 +5,7 @@ struct A { A(); - A(const A& a) = delete; // { dg-error "declared" } + A(const A& a) = delete; // { dg-message "declared" } }; int main() Index: gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C (working copy) @@ -3,7 +3,7 @@ struct A { A(); - A(const A&) = delete; // { dg-error "declared" } + A(const A&) = delete; // { dg-message "declared" } }; template Index: gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C (working copy) @@ -3,6 +3,6 @@ int main() { - int q = 1; // { dg-error "declared here" } + int q = 1; // { dg-message "declared here" } struct test { int x = q; } instance; // { dg-error "local variable" } } Index: gcc/testsuite/g++.dg/cpp0x/sfinae46.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/sfinae46.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/sfinae46.C (working copy) @@ -0,0 +1,13 @@ +// PR c++/57419 +// { dg-do compile { target c++11 } } + +template< typename q > +decltype( &q::f ) t( q ) {} + +char t( ... ) { return {}; } + +class c { void f() = delete; }; +class d { static void f() = delete; }; + +static_assert( sizeof( t( c() ) ), "c" ); +static_assert( sizeof( t( d() ) ), "d" ); Index: gcc/testsuite/g++.dg/cpp0x/union4.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/union4.C (revision 199598) +++ gcc/testsuite/g++.dg/cpp0x/union4.C (working copy) @@ -3,7 +3,7 @@ struct SFoo { - SFoo() =delete; // { dg-error "declared" } + SFoo() =delete; // { dg-message "declared" } }; union UFoo // { dg-error "deleted" } Index: gcc/testsuite/g++.dg/template/crash108.C =================================================================== --- gcc/testsuite/g++.dg/template/crash108.C (revision 199598) +++ gcc/testsuite/g++.dg/template/crash108.C (working copy) @@ -1,5 +1,5 @@ // PR c++/50861 template struct A {A(int b=k(0));}; // { dg-error "parameter|arguments" } -void f(int k){A a;} // // { dg-error "declared" } +void f(int k){A a;} // // { dg-message "declared" } // { dg-message "note" "note" { target *-*-* } 3 } Index: gcc/testsuite/g++.dg/template/crash41.C =================================================================== --- gcc/testsuite/g++.dg/template/crash41.C (revision 199598) +++ gcc/testsuite/g++.dg/template/crash41.C (working copy) @@ -1,7 +1,7 @@ // PR c++/22464 template -void do_something(const T* A) // { dg-error "declared" } +void do_something(const T* A) // { dg-message "declared" } { struct helper_t{ helper_t() { Index: gcc/testsuite/g++.old-deja/g++.jason/local.C =================================================================== --- gcc/testsuite/g++.old-deja/g++.jason/local.C (revision 199598) +++ gcc/testsuite/g++.old-deja/g++.jason/local.C (working copy) @@ -5,7 +5,7 @@ int x; void f () { static int s; - int x; // { dg-error "" } referenced below + int x; // { dg-message "" } referenced below extern int q(); struct local { Index: gcc/testsuite/g++.old-deja/g++.law/visibility3.C =================================================================== --- gcc/testsuite/g++.old-deja/g++.law/visibility3.C (revision 199598) +++ gcc/testsuite/g++.old-deja/g++.law/visibility3.C (working copy) @@ -11,7 +11,7 @@ int x; int main(void) { static int s; - int x; // { dg-error "" } declared + int x; // { dg-message "" } declared extern int g(); struct local { Index: libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc =================================================================== --- libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc (revision 199598) +++ libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc (working copy) @@ -27,4 +27,4 @@ struct D : B { }; D d; std::default_delete db; typedef decltype(db(&d)) type; // { dg-error "use of deleted function" } -// { dg-error "declared here" "" { target *-*-* } 122 } +// { dg-prune-output "declared" }