[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-bugs
Subject:    [Bug c++/61020] New: [4.9/4.10 Regression] typeid(typeid(X)) produces 'ud2'
From:       "ppluzhnikov at google dot com" <gcc-bugzilla () gcc ! gnu ! org>
Date:       2014-04-30 17:27:43
Message-ID: bug-61020-4 () http ! gcc ! gnu ! org/bugzilla/
[Download RAW message or body]

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

            Bug ID: 61020
           Summary: [4.9/4.10 Regression] typeid(typeid(X)) produces 'ud2'
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ppluzhnikov at google dot com

The test case:

#include <typeinfo>

struct Base {
  virtual ~Base() { }
};

struct Derived : public Base {
};

int compare(const Base& base)
{
  return typeid(base) == typeid(typeid(Derived));
}

int main()
{
  Base base;
  Derived derived;

  if (compare(base)) return 1;
  if (compare(derived)) return 2;
  return 0;
}


Using trunk @ r209848
g++ -g t.cc && ./a.out && echo OK
OK

g++ -g t.cc -O2 && ./a.out 
Segmentation fault (core dumped)

(gdb) disas main
Dump of assembler code for function main():
   0x00000000004004c0 <+0>:     mov    0x8,%rax
   0x00000000004004c8 <+8>:     ud2    
End of assembler dump.


It appears that GCC believes the test to invoke undefined behavior.
However, I don't see anything in the standard to support this.

P.S. Same result in C++98 and C++11
P.P.S. In the original code, the double application of typeid() was a bug.
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic