From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lxmtout2.gsi.de (lxmtout2.gsi.de [140.181.3.112]) by sourceware.org (Postfix) with ESMTPS id B6B893858018 for ; Tue, 25 May 2021 19:16:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B6B893858018 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gsi.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=M.Kretz@gsi.de Received: from localhost (localhost [127.0.0.1]) by lxmtout2.gsi.de (Postfix) with ESMTP id 2BFD0202AD6D for ; Tue, 25 May 2021 21:16:11 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at lxmtout2.gsi.de Received: from lxmtout2.gsi.de ([127.0.0.1]) by localhost (lxmtout2.gsi.de [127.0.0.1]) (amavisd-new, port 10024) with LMTP id lNKddyyUQsI9 for ; Tue, 25 May 2021 21:16:11 +0200 (CEST) Received: from srvex3.campus.gsi.de (unknown [10.10.4.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by lxmtout2.gsi.de (Postfix) with ESMTPS id 0FA34202AD65 for ; Tue, 25 May 2021 21:16:11 +0200 (CEST) Received: from excalibur.localnet (140.181.3.12) by srvex3.campus.gsi.de (10.10.4.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2242.10; Tue, 25 May 2021 21:16:10 +0200 From: Matthias Kretz To: Subject: [PATCH] c++: Output less irrelevant info for function template decl [PR100716] Date: Tue, 25 May 2021 21:16:10 +0200 Message-ID: <3000132.OxmWWEHjG1@excalibur> Organization: GSI Helmholtzzentrum =?UTF-8?B?ZsO8cg==?= Schwerionenforschung MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart1853600.azUnuu2Gft" Content-Transfer-Encoding: 7Bit X-Originating-IP: [140.181.3.12] X-ClientProxiedBy: srvex3.Campus.gsi.de (10.10.4.16) To srvex3.campus.gsi.de (10.10.4.16) X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_PASS, TXREP, T_SPF_HELO_PERMERROR, URIBL_SBL, URIBL_SBL_A autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 May 2021 19:16:15 -0000 --nextPart1853600.azUnuu2Gft Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="UTF-8" CkZyb206IE1hdHRoaWFzIEtyZXR6IDxrcmV0ekBrZGUub3JnPgoKRW5zdXJlIGR1bXBfdGVtcGxh dGVfZGVjbCBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzIG5ldmVyIHByaW50cyB0ZW1wbGF0ZSAKcGFy YW1ldGVycyBhZnRlciB0aGUgZnVuY3Rpb24gbmFtZSAoaXQgZGlkIHdpdGggLWZuby1wcmV0dHkt dGVtcGxhdGVzKSBhbmQgCnNraXAgb3V0cHV0IG9mIGlycmVsZXZhbnQgJiBjb25mdXNpbmcgIlt3 aXRoIFQgPSBUXSIgaW4gZHVtcF9zdWJzdGl0dXRpb24uCgpnY2MvY3AvQ2hhbmdlTG9nOgoKCVBS IGMrKy8xMDA3MTYKCSogZXJyb3IuYyAoZHVtcF90ZW1wbGF0ZV9iaW5kaW5ncyk6IEluY2x1ZGUg Y29kZSB0byBwcmludAoJIlt3aXRoIiBhbmQgJ10nLCBjb25kaXRpb25hbCBvbiB3aGV0aGVyIGFu eXRoaW5nIGlzIHByaW50ZWQgYXQKCWFsbC4gVGhpcyBpcyB0aWVkIHRvIHdoZXRoZXIgYSBzZW1p Y29sb24gaXMgbmVlZGVkIHRvIHNlcGFyYXRlCgltdWx0aXBsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJz LiBJZiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgcmVwZWF0cwoJdGhlIHRlbXBsYXRlIHBhcmFtZXRl ciAoVCA9IFQpLCB0aGVuIHNraXAgdGhlIHBhcmFtZXRlci4KCShkdW1wX3N1YnN0aXR1dGlvbik6 IE1vdmVkIGNvZGUgdG8gcHJpbnQgIlt3aXRoIiBhbmQgJ10nIHRvCglkdW1wX3RlbXBsYXRlX2Jp bmRpbmdzLgoJKGR1bXBfZnVuY3Rpb25fZGVjbCk6IFBhcnRpYWwgcmV2ZXJ0IG9mIFBSNTA4Mjgs IHdoaWNoIG1hc2tlZAoJVEZGX1RFTVBMQVRFX05BTUUgZm9yIGFsbCBvZiBkdW1wX2Z1bmN0aW9u X2RlY2wuIE5vdwoJVEZGX1RFTVBMQVRFX05BTUUgaXMgbWFza2VkIGZvciB0aGUgc2NvcGUgb2Yg dGhlIGZ1bmN0aW9uIGFuZAoJb25seSBjYXJyaWVzIHRocm91Z2ggdG8gZHVtcF9mdW5jdGlvbl9u YW1lLgoJKGR1bXBfZnVuY3Rpb25fbmFtZSk6IEF2b2lkIGNhbGxpbmcgZHVtcF90ZW1wbGF0ZV9w YXJtcyBpZgoJVEZGX1RFTVBMQVRFX05BTUUgaXMgc2V0LgoKZ2NjL3Rlc3RzdWl0ZS9DaGFuZ2VM b2c6CgoJUFIgYysrLzEwMDcxNgoJKiBnKysuZGcvZGlhZ25vc3RpYy9wcjEwMDcxNi5DOiBOZXcg dGVzdC4KCSogZysrLmRnL2RpYWdub3N0aWMvcHIxMDA3MTYtMS5DOiBTYW1lIHRlc3Qgd2l0aAoJ LWZuby1wcmV0dHktdGVtcGxhdGVzLgotLS0KIGdjYy9jcC9lcnJvci5jICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgNTkgKysrKysrKysrKysrKysrLS0tLS0KIGdjYy90ZXN0c3VpdGUv ZysrLmRnL2RpYWdub3N0aWMvcHIxMDA3MTYtMS5DIHwgNTQgKysrKysrKysrKysrKysrKysrCiBn Y2MvdGVzdHN1aXRlL2crKy5kZy9kaWFnbm9zdGljL3ByMTAwNzE2LkMgICB8IDU0ICsrKysrKysr KysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAxNTIgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvZGlhZ25vc3Rp Yy9wcjEwMDcxNi0xLkMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2crKy5kZy9k aWFnbm9zdGljL3ByMTAwNzE2LkMKCgotLQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIAKIERyLiBNYXR0aGlhcyBLcmV0eiAgICAgICAgICAgICAgICAg ICAgICAgICAgIGh0dHBzOi8vbWF0dGtyZXR6LmdpdGh1Yi5pbwogR1NJIEhlbG1ob2x0eiBDZW50 cmUgZm9yIEhlYXZ5IElvbiBSZXNlYXJjaCAgICAgICAgICAgICAgIGh0dHBzOi8vZ3NpLmRlCiBz dGQ6OmV4cGVyaW1lbnRhbDo6c2ltZCAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL1Zj RGV2ZWwvc3RkLXNpbWQK4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA --nextPart1853600.azUnuu2Gft Content-Disposition: inline; filename="0001-c-Output-less-irrelevant-info-for-function-template-.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="utf-8"; name="0001-c-Output-less-irrelevant-info-for-function-template-.patch" diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 010fbce41a7..bc0b68f07e0 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -381,7 +381,32 @@ static void dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, vec *typenames) { - bool need_semicolon = false; + struct prepost_semicolon + { + cxx_pretty_printer *pp; + bool need_semicolon = false; + + void operator()() + { + if (need_semicolon) + pp_separate_with_semicolon (pp); + else + { + pp_cxx_whitespace (pp); + pp_cxx_left_bracket (pp); + pp->translate_string ("with"); + pp_cxx_whitespace (pp); + need_semicolon = true; + } + } + + ~prepost_semicolon() + { + if (need_semicolon) + pp_cxx_right_bracket (pp); + } + } semicolon_or_introducer = {pp}; + int i; tree t; @@ -405,10 +430,19 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx) arg = TREE_VEC_ELT (lvl_args, arg_idx); - if (need_semicolon) - pp_separate_with_semicolon (pp); - dump_template_parameter (pp, TREE_VEC_ELT (p, i), - TFF_PLAIN_IDENTIFIER); + tree parm_i = TREE_VEC_ELT (p, i); + /* Skip this parameter if it just noise such as "T = T". */ + if (arg && TREE_CODE (arg) == TEMPLATE_TYPE_PARM + && TREE_CODE (parm_i) == TREE_LIST + && TREE_CODE (TREE_VALUE (parm_i)) == TYPE_DECL + && TREE_CODE (TREE_TYPE (TREE_VALUE (parm_i))) + == TEMPLATE_TYPE_PARM + && DECL_NAME (TREE_VALUE (parm_i)) + == DECL_NAME (TREE_CHAIN (arg))) + continue; + + semicolon_or_introducer(); + dump_template_parameter (pp, parm_i, TFF_PLAIN_IDENTIFIER); pp_cxx_whitespace (pp); pp_equal (pp); pp_cxx_whitespace (pp); @@ -424,7 +458,6 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, pp_string (pp, M_("")); ++arg_idx; - need_semicolon = true; } parms = TREE_CHAIN (parms); @@ -446,8 +479,7 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, FOR_EACH_VEC_SAFE_ELT (typenames, i, t) { - if (need_semicolon) - pp_separate_with_semicolon (pp); + semicolon_or_introducer(); dump_type (pp, t, TFF_PLAIN_IDENTIFIER); pp_cxx_whitespace (pp); pp_equal (pp); @@ -1652,12 +1684,7 @@ dump_substitution (cxx_pretty_printer *pp, && !(flags & TFF_NO_TEMPLATE_BINDINGS)) { vec *typenames = t ? find_typenames (t) : NULL; - pp_cxx_whitespace (pp); - pp_cxx_left_bracket (pp); - pp->translate_string ("with"); - pp_cxx_whitespace (pp); dump_template_bindings (pp, template_parms, template_args, typenames); - pp_cxx_right_bracket (pp); } } @@ -1698,7 +1725,8 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags) bool constexpr_p; tree ret = NULL_TREE; - flags &= ~(TFF_UNQUALIFIED_NAME | TFF_TEMPLATE_NAME); + int dump_function_name_flags = flags & ~TFF_UNQUALIFIED_NAME; + flags = dump_function_name_flags & ~TFF_TEMPLATE_NAME; if (TREE_CODE (t) == TEMPLATE_DECL) t = DECL_TEMPLATE_RESULT (t); @@ -1782,7 +1810,7 @@ dump_function_decl (cxx_pretty_printer *pp, tree t, int flags) else dump_scope (pp, CP_DECL_CONTEXT (t), flags); - dump_function_name (pp, t, flags); + dump_function_name (pp, t, dump_function_name_flags); if (!(flags & TFF_NO_FUNCTION_ARGUMENTS)) { @@ -2006,6 +2034,7 @@ dump_function_name (cxx_pretty_printer *pp, tree t, int flags) dump_module_suffix (pp, t); if (DECL_TEMPLATE_INFO (t) + && !(flags & TFF_TEMPLATE_NAME) && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t) && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t)))) diff --git a/gcc/testsuite/g++.dg/diagnostic/pr100716-1.C b/gcc/testsuite/g++.dg/diagnostic/pr100716-1.C new file mode 100644 index 00000000000..93490da6a83 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/pr100716-1.C @@ -0,0 +1,54 @@ +// { dg-options "-fno-pretty-templates" } + +template + struct A + { + template + void f() {} // { dg-line Af } + + template + void g(U) {} // { dg-line Ag } + }; + +template + struct B + { + template + void f(U) {} // { dg-line Bf } + + template + void g(U, T) {} // { dg-line Bg } + }; + +struct C +{ + template + void f(U) {} // { dg-line Cf } + + template + void g() {} // { dg-line Cg } +}; + +int main() +{ + A().f(0); // { dg-error "no matching function for call to 'A::f\\(int\\)'" } + // { dg-message "candidate: 'template void A::f\\(\\)'" "" { target *-*-* } Af } + + A().g(); // { dg-error "no matching function for call to 'A::g\\(\\)'" } + // { dg-message "candidate: 'template void A::g\\(U\\)'" "" { target *-*-* } Ag } + + B().f(); // { dg-error "no matching function for call to 'B::f\\(\\)'" } + // { dg-message "candidate: 'template void B::f\\(U\\)'" "" { target *-*-* } Bf } + + B().g(); // { dg-error "no matching function for call to 'B::g\\(\\)'" } + // { dg-message "candidate: 'template void B::g\\(U, int\\)'" "" { target *-*-* } Bg } + + B().g(0); // { dg-error "no matching function for call to 'B::g\\(int\\)'" } + // { dg-message "candidate: 'template void B::g\\(U, float\\)'" "" { target *-*-* } Bg } + + C().f(); // { dg-error "no matching function for call to 'C::f\\(\\)'" } + // { dg-message "candidate: 'template void C::f\\(U\\)'" "" { target *-*-* } Cf } + + C().g(0); // { dg-error "no matching function for call to 'C::g\\(int\\)'" } + // { dg-message "candidate: 'template void C::g\\(\\)'" "" { target *-*-* } Cg } +} diff --git a/gcc/testsuite/g++.dg/diagnostic/pr100716.C b/gcc/testsuite/g++.dg/diagnostic/pr100716.C new file mode 100644 index 00000000000..4a1f0a4e10a --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/pr100716.C @@ -0,0 +1,54 @@ +// { dg-options "-fpretty-templates" } + +template + struct A + { + template + void f() {} // { dg-line Af } + + template + void g(U) {} // { dg-line Ag } + }; + +template + struct B + { + template + void f(U) {} // { dg-line Bf } + + template + void g(U, T) {} // { dg-line Bg } + }; + +struct C +{ + template + void f(U) {} // { dg-line Cf } + + template + void g() {} // { dg-line Cg } +}; + +int main() +{ + A().f(0); // { dg-error "no matching function for call to 'A::f\\(int\\)'" } + // { dg-message "candidate: 'template void A::f\\(\\) \\\[with T = int\\\]'" "" { target *-*-* } Af } + + A().g(); // { dg-error "no matching function for call to 'A::g\\(\\)'" } + // { dg-message "candidate: 'template void A::g\\(U\\) \\\[with T = int\\\]'" "" { target *-*-* } Ag } + + B().f(); // { dg-error "no matching function for call to 'B::f\\(\\)'" } + // { dg-message "candidate: 'template void B::f\\(U\\) \\\[with T = int\\\]'" "" { target *-*-* } Bf } + + B().g(); // { dg-error "no matching function for call to 'B::g\\(\\)'" } + // { dg-message "candidate: 'template void B::g\\(U, T\\) \\\[with T = int\\\]'" "" { target *-*-* } Bg } + + B().g(0); // { dg-error "no matching function for call to 'B::g\\(int\\)'" } + // { dg-message "candidate: 'template void B::g\\(U, T\\) \\\[with T = float\\\]'" "" { target *-*-* } Bg } + + C().f(); // { dg-error "no matching function for call to 'C::f\\(\\)'" } + // { dg-message "candidate: 'template void C::f\\(U\\)'" "" { target *-*-* } Cf } + + C().g(0); // { dg-error "no matching function for call to 'C::g\\(int\\)'" } + // { dg-message "candidate: 'template void C::g\\(\\)'" "" { target *-*-* } Cg } +} --nextPart1853600.azUnuu2Gft--