From patchwork Thu Nov 15 19:52:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Sidwell X-Patchwork-Id: 998534 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-490203-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=acm.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="RGJAjC00"; dkim-atps=neutral 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 42wsTc2ztPz9s1c for ; Fri, 16 Nov 2018 06:52:35 +1100 (AEDT) Received: (qmail 93337 invoked by alias); 15 Nov 2018 19:52:28 -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 93328 invoked by uid 89); 15 Nov 2018 19:52:28 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:3033, Conversion X-HELO: mail-yw1-f51.google.com Received: from mail-yw1-f51.google.com (HELO mail-yw1-f51.google.com) (209.85.161.51) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 15 Nov 2018 19:52:24 +0000 Received: by mail-yw1-f51.google.com with SMTP id r199so1517834ywe.4 for ; Thu, 15 Nov 2018 11:52:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=BANI0nk/fCdEE6bEcm7tEbI7baF+ZLD0vIpkFiVGYbA=; b=RGJAjC00u7Ix766hthWtCpmSRu9/wlYa+T9jXl6XGKbd+B2jSbm5AcqT2YfBAdixKo IPcI+Uw1SM7M+nI++oZbFQN8YVP4ZHufwpYHcpa7TBllfE5GwMm2P/jK6j/GbCmYhfx+ szNCsmabrEFmnKnv52+/4TsvXPab0p9SD7z2sjx0sWwR0bMYE4s9GujhusHf75RPhzSM YonhfLAESmQdWzgHeJgH22nNsbkzvstHjLEwlt3hGifnfgF+yHrv3//RhpvJAXj5Ar4W RG0GCNeHPG1b2zxdLkFu1E/t2BWv1dH6eZQCzR11n9tjwkt7Qwv+cNimwJV7OfZRvgHA 02Dw== Received: from ?IPv6:2620:10d:c0a3:20fb:5df8:65a2:5940:e964? ([2620:10d:c091:200::6:76fb]) by smtp.googlemail.com with ESMTPSA id o14sm75726ywo.52.2018.11.15.11.52.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Nov 2018 11:52:22 -0800 (PST) Sender: Nathan Sidwell To: GCC Patches From: Nathan Sidwell Subject: [PR c++/86246] ICE tsubst explicit operator call Message-ID: Date: Thu, 15 Nov 2018 14:52:21 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 We weren't noticing that 'expr.operator T()' is dependent if T is dependent. Therefore we looked up 'operator T' at template definition time and went down hill from there. 86246 and 87989 had different failure modes (one iced, one generated wrong code), so adding both. booted & tested on x86_64-linux, applying to trunk. nathan 2018-11-15 Nathan Sidwell PR c++/86246 PR c++/87989 * typeck.c (finish_class_member_access_expr): Conversion operator to dependent type is dependent. * g++.dg/template/pr86246.C: New. * g++.dg/template/pr87989.C: New. Index: cp/typeck.c =================================================================== --- cp/typeck.c (revision 266191) +++ cp/typeck.c (working copy) @@ -2884,7 +2884,12 @@ finish_class_member_access_expr (cp_expr expression is dependent. */ || (TREE_CODE (name) == SCOPE_REF && TYPE_P (TREE_OPERAND (name, 0)) - && dependent_scope_p (TREE_OPERAND (name, 0)))) + && dependent_scope_p (TREE_OPERAND (name, 0))) + /* If NAME is operator T where "T" is dependent, we can't + lookup until we instantiate the T. */ + || (TREE_CODE (name) == IDENTIFIER_NODE + && IDENTIFIER_CONV_OP_P (name) + && dependent_type_p (TREE_TYPE (name)))) { dependent: return build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF, Index: testsuite/g++.dg/template/pr86246.C =================================================================== --- testsuite/g++.dg/template/pr86246.C (revision 0) +++ testsuite/g++.dg/template/pr86246.C (working copy) @@ -0,0 +1,38 @@ +// { dg-do compile { target c++11 } } +// PR c++/86246 ICE in tsubst + +namespace std { + template struct is_class { + static constexpr bool value = true; + }; + template<> struct is_class { + static constexpr bool value = false; + }; +} + +class MyClass { + public: + operator double() const { + return 1; + } + template + operator T() const { + static_assert(std::is_class::value, "problem"); + return T(); + } +}; + +template +void SetValue(const MyClass& obj, T* value) { + // erroneously dispatched to operator T when T is double + *value = obj.operator T(); +} + +int main() { + MyClass obj; + // works fine + obj.operator double (); + double x; + // error, when operator T is called in SetValue + SetValue(obj, &x); +} Index: testsuite/g++.dg/template/pr87989.C =================================================================== --- testsuite/g++.dg/template/pr87989.C (revision 0) +++ testsuite/g++.dg/template/pr87989.C (working copy) @@ -0,0 +1,20 @@ +// PR c++/87989 +// { dg-do link } +// Resolved to template instantiation rather than non-template fn. + +struct X { + template operator T() const; // no definition + operator float() const {return 0.f;} +}; + +template +T f(const X &x) { + // Resoved in error to X::operator float() const` + // instead of correct `X::operator float() const + return x.operator T(); +} + +int main () +{ + return f(X ()); +}