[LLVMbugs] [Bug 14557] New: clang doesn't generate "complete object constructor" code when the class contains pure virtual method.

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sun Dec 9 23:08:48 PST 2012


http://llvm.org/bugs/show_bug.cgi?id=14557

             Bug #: 14557
           Summary: clang doesn't generate "complete object constructor"
                    code when the class contains pure virtual method.
           Product: clang
           Version: 3.1
          Platform: Macintosh
        OS/Version: MacOS X
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: orchidnju-dummy at yahoo.com.cn
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


[NOTE] Not sure whether it's clang++ bug, but it's behavior is different from
llvm-g++, so I want to get confirmation on whether clang obey standard and the
behavior is as designed. As a plus, is there any document introduce clang's C++
mangling rule?

[Summary] clang doesn't generate "complete object constructor" (the C1 version)
code when the class contains pure virtual method. 

[Reproduce Steps]
1. create ABISample.cpp to include below code. class A is common class, class B
contains 1 pure virtual method.
===============================
class A
{
public:
    A();
};

class B
{
public:
    B();
    virtual void Foo() = 0;
};

A::A() {};
B::B() {};
===============================

2. compile the code with clang++/g++:
- clang++ -c ABISample.cpp -o clang.o
- g++ -c ABISample.cpp -o g++.o

3. use nm to check generated symbols:
$ nm clang.o 
00000000000000e0 s EH_frame0
0000000000000000 T __ZN1AC1Ev
00000000000000f8 S __ZN1AC1Ev.eh
0000000000000020 T __ZN1AC2Ev
0000000000000120 S __ZN1AC2Ev.eh
0000000000000030 T __ZN1BC2Ev
0000000000000148 S __ZN1BC2Ev.eh
0000000000000068 S __ZTI1B
0000000000000078 S __ZTS1B
0000000000000050 S __ZTV1B
                 U __ZTVN10__cxxabiv117__class_type_infoE
                 U ___cxa_pure_virtual

$ nm g++.o 
00000000000000a8 s EH_frame0
000000000000000a T __ZN1AC1Ev
00000000000000f0 S __ZN1AC1Ev.eh
0000000000000000 T __ZN1AC2Ev
00000000000000c0 S __ZN1AC2Ev.eh
000000000000003c T __ZN1BC1Ev
0000000000000150 S __ZN1BC1Ev.eh
0000000000000014 T __ZN1BC2Ev
0000000000000120 S __ZN1BC2Ev.eh
0000000000000090 S __ZTI1B
00000000000000a0 S __ZTS1B
0000000000000070 S __ZTV1B
                 U __ZTVN10__cxxabiv117__class_type_infoE
                 U ___cxa_pure_virtual

4. compare two symbol list, you can find class B's C1 constructor are generated
by g++ but not clang++:
000000000000003c T __ZN1BC1Ev
0000000000000150 S __ZN1BC1Ev.eh

5. If I remove "= 0" from Foo() to change it from pure virtual to virtual
method, clang will generate C1 constructor.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list