This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug gcov-profile/53534] New: gcov erroneously reporting opening brace of constructor is never executed.


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

             Bug #: 53534
           Summary: gcov erroneously reporting opening brace of
                    constructor is never executed.
    Classification: Unclassified
           Product: gcc
           Version: 4.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: gcov-profile
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: spammymatt94@yahoo.com


Created attachment 27527
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27527
bug.ii

PROBLEM:

        -:   21:template<typename T>
        1:   22:inline A<T>::A()
    #####:   23:{
        1:   24:}

How can lines 22 and 24 of this simple no-arg constructor be executed once,
without line 23 also being executed once?  Isn't that impossible?

SOURCE:

This is the simplest test case I could come up with that exhibits the problem. 
In particular, if I do ANY of the following, the problem magically goes away.

    - Eliminate the unused templatization parameter from class A.
    - Eliminate data member _b (and eliminate class B altogether).
    - Eliminate the string data members _s from either class A or class B.
    - Change either string data member to a simpler type (e.g., an int).
    - Move the inlined no-arg constructor inside class A's definition block.
    - Move the opening brace of the no-arg constructor up to the previous line.

bug.cpp:

    #include <string>

    using namespace std;

    class B
    {
        public:
            string _s;
    };

    template<typename T>
    class A
    {
        public:
            B      _b;
            string _s;

            A();
    };

    template<typename T>
    inline A<T>::A()
    {
    }

    int main()
    {
        A<int> a;
        return 0;
    }

PLATFORM:

I think I'm running the standard gcc/g++ stuff that comes with ubuntu lucid:

> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 10.04.4 LTS
Release:        10.04
Codename:       lucid

COMPILE LINE:

> g++ -v -Wall -Wextra --cover --save-temps -o bug -g -lstdc++ bug.cpp
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.4.3-4ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared
--enable-multiarch --enable-linker-build-id --with-system-zlib
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls
--enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc
--enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic
--enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
--target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
COLLECT_GCC_OPTIONS='-v' '-Wall' '-Wextra' '-coverage' '-save-temps' '-o' 'bug'
'-g' '-shared-libgcc' '-mtune=generic' '-march=i486'
 /usr/lib/gcc/i486-linux-gnu/4.4.3/cc1plus -E -quiet -v -D_GNU_SOURCE bug.cpp
-D_FORTIFY_SOURCE=2 -mtune=generic -march=i486 -Wall -Wextra -g
-fworking-directory -fpch-preprocess -fstack-protector -o bug.ii
ignoring nonexistent directory "/usr/local/include/i486-linux-gnu"
ignoring nonexistent directory
"/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../i486-linux-gnu/include"
ignoring nonexistent directory "/usr/include/i486-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.4
 /usr/include/c++/4.4/i486-linux-gnu
 /usr/include/c++/4.4/backward
 /usr/local/include
 /usr/lib/gcc/i486-linux-gnu/4.4.3/include
 /usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-Wall' '-Wextra' '-coverage' '-save-temps' '-o' 'bug'
'-g' '-shared-libgcc' '-mtune=generic' '-march=i486'
 /usr/lib/gcc/i486-linux-gnu/4.4.3/cc1plus -fpreprocessed bug.ii -quiet
-dumpbase bug.cpp -mtune=generic -march=i486 -auxbase bug -g -Wall -Wextra
-version -fprofile-arcs -ftest-coverage -fstack-protector -o bug.s
GNU C++ (Ubuntu 4.4.3-4ubuntu5.1) version 4.4.3 (i486-linux-gnu)
        compiled by GNU C version 4.4.3, GMP version 4.3.2, MPFR version
2.4.2-p1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C++ (Ubuntu 4.4.3-4ubuntu5.1) version 4.4.3 (i486-linux-gnu)
        compiled by GNU C version 4.4.3, GMP version 4.3.2, MPFR version
2.4.2-p1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 96a18a11c5c7ae143163545923e7167b
COLLECT_GCC_OPTIONS='-v' '-Wall' '-Wextra' '-coverage' '-save-temps' '-o' 'bug'
'-g' '-shared-libgcc' '-mtune=generic' '-march=i486'
 as -V -Qy -o bug.o bug.s
GNU assembler version 2.20.1 (i486-linux-gnu) using BFD version (GNU Binutils
for Ubuntu) 2.20.1-system.20100303
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../:/lib/:/usr/lib/:/usr/lib/i486-linux-gnu/
COLLECT_GCC_OPTIONS='-v' '-Wall' '-Wextra' '-coverage' '-save-temps' '-o' 'bug'
'-g' '-shared-libgcc' '-mtune=generic' '-march=i486'
 /usr/lib/gcc/i486-linux-gnu/4.4.3/collect2 --build-id --eh-frame-hdr -m
elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o bug -z relro
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o
-L/usr/lib/gcc/i486-linux-gnu/4.4.3 -L/usr/lib/gcc/i486-linux-gnu/4.4.3
-L/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib -L/lib/../lib
-L/usr/lib/../lib -L/usr/lib/gcc/i486-linux-gnu/4.4.3/../../..
-L/usr/lib/i486-linux-gnu -lstdc++ bug.o -lstdc++ -lm -lgcov -lgcc_s -lgcc -lc
-lgcc_s -lgcc /usr/lib/gcc/i486-linux-gnu/4.4.3/crtend.o
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crtn.o

PROGRAM EXECUTION AND GCOV PROFILING:

./bug
gcov bug

OFFENDING OUTPUT:

bug.cpp.gcov:

        -:    0:Source:bug.cpp
        -:    0:Graph:bug.gcno
        -:    0:Data:bug.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <string>
        -:    2:
        -:    3:using namespace std;
        -:    4:
        -:    5:class B
        2:    6:{
        -:    7:    public:
        -:    8:        string _s;
        -:    9:};
        -:   10:
        -:   11:template<typename T>
        -:   12:class A
        1:   13:{
        -:   14:    public:
        -:   15:        B      _b;
        -:   16:        string _s;
        -:   17:
        -:   18:        A();
        -:   19:};
        -:   20:
        -:   21:template<typename T>
        1:   22:inline A<T>::A()
    #####:   23:{
        1:   24:}
        -:   25:
        1:   26:int main()
        -:   27:{
        1:   28:    A<int> a;
        1:   29:    return 0;
        -:   30:}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]