[Bug c++/61941] New: Mis-parsing of warn_unused_result function with ref-qualifiers

thiago at kde dot org gcc-bugzilla@gcc.gnu.org
Tue Jul 29 01:44:00 GMT 2014


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61941

            Bug ID: 61941
           Summary: Mis-parsing of warn_unused_result function with
                    ref-qualifiers
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: thiago at kde dot org

Testcase:

====
class S
{
public:
    S x() const __attribute__ ((__warn_unused_result__));

    S y() const & __attribute__ ((__warn_unused_result__));
    S y() && __attribute__ ((__warn_unused_result__));
};
====
(Almost minimal testcase; remove the last
__attribute__((__warn_unused_result__)) for truly minimal)

When compiled produces the following output:
test.ii:7:7: error: ‘S S::y() &&’ cannot be overloaded
     S y() && __attribute__ ((__warn_unused_result__));
       ^
test.ii:6:7: error: with ‘S S::y() const’
     S y() const & __attribute__ ((__warn_unused_result__));
       ^

Tested with GCC 4.8.1 (openSUSE 13.1) and 4.9.2 (gcc-4_8-branch revision
213070).

If you read only the error message, it is correct: "S::y() &&" cannot be
overloaded with "S::y() const". However. the overload of y on line 6 that GCC
complains about is actually "S::y() const &", which is allowed to be
overloaded. Somehow the & ref-qualifier got lost in the parsing.

The error does not depend on the order of lines 6 and 7. It does depend on
S::x() const appearing before S::y() const & and that both functions have the
attribute.


More information about the Gcc-bugs mailing list