From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6653 invoked by alias); 25 Jun 2008 08:37:45 -0000 Received: (qmail 5455 invoked by uid 48); 25 Jun 2008 08:36:53 -0000 Date: Wed, 25 Jun 2008 08:37:00 -0000 Subject: [Bug c++/36628] New: incorrect declspec() handling of conditional operator X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "abarbati at iaanus dot com" 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: 2008-06/txt/msg01486.txt.bz2 I compiled the following code with gcc 4.3.0 mingw (more details at the end of the report) with: g++ -std=c++0x test.cpp ---- #include #include int rvalue(); int& lvalueref(); int&& rvalueref(); decltype(true ? rvalue() : rvalue()) f() {} decltype(true ? lvalueref() : lvalueref()) g() {} decltype(true ? rvalueref() : rvalueref()) h() {} int main() { std::cout << typeid(f).name() << "\n"; std::cout << typeid(g).name() << "\n"; std::cout << typeid(h).name() << "\n"; } ----- The output is: FivE FRivE FOivE this suggests that declspec() was interpreted respectively as int, int& and int&&. However a careful reading of clause 5, paragraph 5 and 6, makes it clear that the result should have been int in all three cases, so correct output should have been: FivE FivE FivE The fact is that, when evaluating the type of the arguments of the conditional operator, int& and int&& should be adjusted to int "prior to any further analysis". Once both the second and third parameters are adjusted to int, the conditional operator can't help returning an int (5.16/6). To be precise, the results are an lvalue of type int and rvalue of type int, respectively, but that is very different from saying that they are int& and int&& and declspec should be aware of that. Additional compiler info: $ g++ -v Using built-in specs. Target: mingw32 Configured with: ../gcc-4.3.0/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++ --disable-sjlj-exceptions --enable-shared --enable-libgcj --enable-libgomp --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-concept-checks --enable-version-specific-runtime-libs --build=mingw32 --with-bugurl=http://www.mingw.org/bugs.shtml --prefix=/mingw --with-gmp=/mingw/src/gcc/gmp-mpfr-root --with-mpfr=/mingw/src/gcc/gmp-mpfr-root --with-libiconv-prefix=/mingw/src/gcc/libiconv-root Thread model: win32 gcc version 4.3.0 20080305 (alpha-testing) mingw-20080502 (GCC) -- Summary: incorrect declspec() handling of conditional operator Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: abarbati at iaanus dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36628