This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/12277] eliminate and warn on dynamic casts with known NULL results
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 11 Jan 2017 21:51:48 +0000
- Subject: [Bug c++/12277] eliminate and warn on dynamic casts with known NULL results
- Auto-submitted: auto-generated
- References: <bug-12277-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=12277
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Priority|P2 |P3
Last reconfirmed|2006-02-26 19:21:22 |2017-1-11
CC| |msebor at gcc dot gnu.org
Summary|Warn on dynamic casts with |eliminate and warn on
|known NULL results. |dynamic casts with known
| |NULL results
Known to fail| |3.3, 4.5.3, 4.8.3, 4.9.3,
| |5.3.0, 6.3.0, 7.0
--- Comment #10 from Martin Sebor <msebor at gcc dot gnu.org> ---
Besides warning, GCC could also optimize the dynamic_cast away when it's known
to fail. The GCC 7.0 dump below for a slightly modified version of the test
case from comment #3 shows that it does neither. At the same time, since this
is a rare case, I don't think it justifies P2. Lowering to P3.
$ gcc$ cat t.C && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout
t.C
struct Base { virtual ~Base () {} };
class Derived : Base { friend int main (); };
int main ()
{
Base *p = new Derived;
if (dynamic_cast<Derived *>(p) != 0)
__builtin_abort ();
}
...
;; Function int main() (main, funcdef_no=4, decl_uid=2303, cgraph_uid=10,
symbol_order=10) (executed once)
int main() ()
{
void * _1;
void * _4;
<bb 2> [100.00%]:
_4 = operator new (8);
MEM[(struct Derived *)_4].D.2316._vptr.Base = &MEM[(void *)&_ZTV7Derived +
16B];
_1 = __dynamic_cast (_4, &_ZTI4Base, &_ZTI7Derived, -2);
if (_1 != 0B)
goto <bb 3>; [0.04%]
else
goto <bb 4>; [99.96%]
<bb 3> [0.04%]:
__builtin_abort ();
<bb 4> [99.96%]:
return 0;
}