From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9236 invoked by alias); 17 Oct 2002 22:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 9203 invoked by uid 71); 17 Oct 2002 22:26:00 -0000 Resent-Date: 17 Oct 2002 22:26:00 -0000 Resent-Message-ID: <20021017222600.9202.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bangerth@ticam.utexas.edu Received: (qmail 3031 invoked by uid 61); 17 Oct 2002 22:19:17 -0000 Message-Id: <20021017221917.3030.qmail@sources.redhat.com> Date: Thu, 17 Oct 2002 15:26:00 -0000 From: bangerth@ticam.utexas.edu Reply-To: bangerth@ticam.utexas.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8271: Templates and pointers to const member functions X-SW-Source: 2002-10/txt/msg00700.txt.bz2 List-Id: >Number: 8271 >Category: c++ >Synopsis: Templates and pointers to const member functions >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Thu Oct 17 15:26:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Wolfgang Bangerth >Release: unknown-1.0 >Organization: >Environment: all gcc versions since at least 2.95 >Description: The following code compiles with gcc: ------------------------------------------- struct X { void f () const; }; template void g(void (T::*) ()); void h () { g (&X::f); }; ------------------------------------------- On the other hand, it fails to compile with at least two other compilers, which made me wonder who's right and who is wrong. The point is that the template function g takes a member function pointer, but we pass a pointer to a _const_ member function. gcc does what seems very reasonable,namely identifying the template argument T with "const X". However, other compilers do not do this. They say there is no prototype for an argument 'void (T::*)() const'. I tried to find normative statements in the standard, but could not find anything that would match my case, which is probably only due to an incomplete search through the standard. So, I would be happy about a statement by someone more knowledgeable about this than me :-) Thanks Wolfgang >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: