// Illustrates some bugs related to __attribute__((warn_unused_result)).

struct Vector {
        float x, y, z;
        inline Vector() {}
        inline Vector(float _x,float _y,float _z) : x(_x), y(_y), z(_z) {}

        // BUG: Toggling the presence of a copy constructor (doesn't matter
which
        // of the ones below you use) will affect the generation of the
warnings.
        inline Vector(const Vector &a) { x = a.x; y = a.y; z = a.z; }
//      inline Vector(const Vector &a) : x(a.x), y(a.y), z(a.z) {}

        inline Vector operator-(const Vector &a) const
__attribute__((warn_unused_result)) {
                return Vector(x - a.x, y - a.y, z - a.z );
        }
};

struct Box {
        Vector min, max;

        // BUG: generates spurrious warning about not using result from
operator-.
        // If you remove the copy constructor, the warning goes away
        inline Vector size() const { return max - min; }
};

void foo() {
        Vector a, b;

        // BUG: this *should* generate a warning, but you will only get a
warning
        // if you have the copy constructor.  If you remove the copy
constructor,
        // the warning goes away
        a-b;
}

//
// Output with copy constructor defined:
//
//   $ /c/usr/local/cell/host-win32/ppu/ppu-lv2/bin/gcc -v -save-temps -c -Wall
warn_unused_result_bug_2.cpp
//   Using built-in specs.
//   Target: ppu-lv2
//   Configured with: /export/fukuoka/ps3-svn/toolchain/trunk/gcc/configure
--target=ppu-lv2 --host=i386-pc-mingw32msvc --build=i686-pc-linux-gnu
--prefix=/usr/local/cell/host-win32/ppu
--with-sysroot=/usr/local/cell/target/ppu --with-headers=yes --disable-threads
--disable-shared --disable-hosted-libstdcxx
//   Thread model: single
//   gcc version 4.0.2 (CELL 4.1.19, $Rev: 1341 $)
//    /usr/local/cell/host-win32/ppu/libexec/gcc/ppu-lv2/4.0.2/cc1plus.exe -E
-quiet -v -iprefix
c:\usr\local\cell\host-win32\ppu\ppu-lv2\bin\../lib/gcc/ppu-lv2/4.0.2/
-D__PPU__ -D__CELLOS_LV2__ warn_unused_result_bug_2.cpp -mabi=altivec -maltivec
-mstrict-align -fstrict-aligned -mvrsave=no -mtraceback=none -Wall
-fpch-preprocess -fno-threadsafe-statics -o warn_unused_result_bug_2.ii
//   ignoring nonexistent directory
"c:/usr/local/cell/host-win32/ppu/ppu-lv2/bin/../lib/gcc/ppu-lv2/4.0.2/include"
//   #include "..." search starts here:
//   #include <...> search starts here:
//    /usr/local/cell/host-win32/ppu/lib/gcc/ppu-lv2/4.0.2/include
//    /usr/local/cell/target/ppu/include
//    /usr/local/cell/target/ppu/include/sys
//    /usr/local/cell/target/ppu/../common/include
//   End of search list.
//    /usr/local/cell/host-win32/ppu/libexec/gcc/ppu-lv2/4.0.2/cc1plus.exe
-fpreprocessed warn_unused_result_bug_2.ii -mabi=altivec -maltivec
-mstrict-align -fstrict-aligned -mvrsave=no -mtraceback=none -quiet -dumpbase
warn_unused_result_bug_2.cpp -auxbase warn_unused_result_bug_2 -Wall -version
-fno-threadsafe-statics -o warn_unused_result_bug_2.s
//   GNU C++ version 4.0.2 (CELL 4.1.19, $Rev: 1341 $) (ppu-lv2)
//           compiled by GNU C version 4.0.2 (CELL 4.1.19, $Rev: 1341 $).
//   GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=130941
//   warn_unused_result_bug_2.cpp: In member function 'Vector Box::size()
const':
//   warn_unused_result_bug_2.cpp:23: warning: ignoring return value of 'Vector
Vector::operator-(const Vector&) const', declared with attribute
warn_unused_result
//   warn_unused_result_bug_2.cpp: In function 'void foo()':
//   warn_unused_result_bug_2.cpp:32: warning: ignoring return value of 'Vector
Vector::operator-(const Vector&) const', declared with attribute
warn_unused_result
//
// If you comment out the copy constructor, the warnings do not appear.
// Note that I produced this with the Playstation (CELL) version of GCC under
// MinGW/MSys, but I don't think this is a platform specific issues.
//
// gccc --version produces this:
// gcc.exe (GCC) 4.0.2 (CELL 4.1.19, $Rev: 1341 $)
// Copyright (C) 2005 Free Software Foundation, Inc.
// This is free software; see the source for copying conditions.  There is NO
// warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// This might be a dup of either of these issues:
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27370
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27371
//
// Cheers,
// fletcherdunn --at-- yahoo.com
//


-- 
           Summary: Spurrious/missing warn_unused_result warnings affected
                    by presence/absense of copy constructor
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: fletcherdunn at yahoo dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31063

Reply via email to