Note: This bug is displayed in read-only format because
the product is no longer active in Red Hat Bugzilla.
RHEL Engineering is moving the tracking of its product development work on RHEL 6 through RHEL 9 to Red Hat Jira (issues.redhat.com). If you're a Red Hat customer, please continue to file support cases via the Red Hat customer portal. If you're not, please head to the "RHEL project" in Red Hat Jira and file new tickets here. Individual Bugzilla bugs in the statuses "NEW", "ASSIGNED", and "POST" are being migrated throughout September 2023. Bugs of Red Hat partners with an assigned Engineering Partner Manager (EPM) are migrated in late September as per pre-agreed dates. Bugs against components "kernel", "kernel-rt", and "kpatch" are only migrated if still in "NEW" or "ASSIGNED". If you cannot log in to RH Jira, please consult article #7032570. That failing, please send an e-mail to the RH Jira admins at rh-issues@redhat.com to troubleshoot your issue as a user management inquiry. The email creates a ServiceNow ticket with Red Hat. Individual Bugzilla bugs that are migrated will be moved to status "CLOSED", resolution "MIGRATED", and set with "MigratedToJIRA" in "Keywords". The link to the successor Jira issue will be found under "Links", have a little "two-footprint" icon next to it, and direct you to the "RHEL project" in Red Hat Jira (issue links are of type "https://issues.redhat.com/browse/RHEL-XXXX", where "X" is a digit). This same link will be available in a blue banner at the top of the page informing you that that bug has been migrated.
DescriptionSiddhesh Poyarekar
2011-04-25 07:40:14 UTC
Description:
The c+ parser seems to differentiate between inline virtual functions that have
the inline keyword only in the function definition as opposed to when it is
present in the declaration. When the inline keyword is only in the definition,
the function is flagged such that code is generated for it, which is not
correct.
How Reproducible:
Always:
Steps to Reproduce and Results:
[siddhesh@localhost ~]$ cat foo.ii
class A {
public:
virtual void f();
};
inline void
A::f()
{
}
[siddhesh@localhost ~]$ g++ -c foo.ii
[siddhesh@localhost ~]$ objdump -dC foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text._ZN1A1fEv:
0000000000000000 <A::f()>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 89 7d f8 mov %rdi,-0x8(%rbp)
8: c9 leaveq
9: c3 retq
Expected Result:
The correct output, as shown when the inline keyword is present (at least) in
the declaration:
[siddhesh@localhost ~]$ cat foo.ii
class A {
public:
virtual inline void f();
};
void
A::f()
{
}
[siddhesh@localhost ~]$ g++ -c foo.ii
[siddhesh@localhost ~]$ objdump -dC foo.o
foo.o: file format elf64-x86-64
Additional Information:
Chapter 9.3 in the C++ standard says:
"an inline member function (whether static or non-static) may also be defined
outside of its class definition provided either its declaration in the class
definition or its definition outside of the class definition declares the
function as inline."
I could not find any exceptions to this rule for virtual functions.
Filed upstream as well:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48759
Description: The c+ parser seems to differentiate between inline virtual functions that have the inline keyword only in the function definition as opposed to when it is present in the declaration. When the inline keyword is only in the definition, the function is flagged such that code is generated for it, which is not correct. How Reproducible: Always: Steps to Reproduce and Results: [siddhesh@localhost ~]$ cat foo.ii class A { public: virtual void f(); }; inline void A::f() { } [siddhesh@localhost ~]$ g++ -c foo.ii [siddhesh@localhost ~]$ objdump -dC foo.o foo.o: file format elf64-x86-64 Disassembly of section .text._ZN1A1fEv: 0000000000000000 <A::f()>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 89 7d f8 mov %rdi,-0x8(%rbp) 8: c9 leaveq 9: c3 retq Expected Result: The correct output, as shown when the inline keyword is present (at least) in the declaration: [siddhesh@localhost ~]$ cat foo.ii class A { public: virtual inline void f(); }; void A::f() { } [siddhesh@localhost ~]$ g++ -c foo.ii [siddhesh@localhost ~]$ objdump -dC foo.o foo.o: file format elf64-x86-64 Additional Information: Chapter 9.3 in the C++ standard says: "an inline member function (whether static or non-static) may also be defined outside of its class definition provided either its declaration in the class definition or its definition outside of the class definition declares the function as inline." I could not find any exceptions to this rule for virtual functions. Filed upstream as well: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48759