From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22451 invoked by alias); 21 Sep 2009 12:51:12 -0000 Received: (qmail 22416 invoked by uid 48); 21 Sep 2009 12:51:02 -0000 Date: Mon, 21 Sep 2009 12:51:00 -0000 Subject: [Bug c++/41426] New: User defined conversion on return ignores array types X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "roger dot ferrer at bsc dot es" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-09/txt/msg01988.txt.bz2 I think g++ simplifies too early array types into pointers when looking for a conversion sequence in a return statement. --- struct B { B (int (&v)[10]); B(); }; B g2() { int c[10]; return c; } --- results in test.cc: In function ‘B g2()’: test.cc:10: error: conversion from ‘int*’ to non-scalar type ‘B’ requested while at least the conversion constructor B::B(int (&)[10]) should be given a chance. For another (slightly) more elaborated example --- template struct A { template A(_T (&V)[_N]); A(); }; A g1() { float f[] = {1.1f, 2.3f}; return f; } --- which gives prova.cc: In function ‘A g1()’: prova.cc:12: error: conversion from ‘float*’ to non-scalar type ‘A’ requested Again, at least the 'A::A<_N>(T (&)[_N])' constructor should be given a chance (which eventually should succeed). Using an explicit-conversion can be used as workaround. -- Summary: User defined conversion on return ignores array types Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: roger dot ferrer at bsc dot es http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41426