Commit 62775f0d by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/68508 (Internal compiler error with parentheses around return value in…

re PR c++/68508 (Internal compiler error with parentheses around return value in C++14 with ASan enabled)

	PR c++/68508
	* cp-tree.h (cp_ubsan_maybe_instrument_downcast): Add INTYPE argument.
	* cp-ubsan.c (cp_ubsan_maybe_instrument_downcast): Likewise.  Use
	it instead of or in addition to TREE_TYPE (op).  Use
	is_properly_derived_from, return NULL_TREE if TREE_TYPE (intype) and
	TREE_TYPE (type) are the same type minus qualifiers.
	* typeck.c (build_static_cast_1): Adjust callers.

	* g++.dg/ubsan/pr68508.C: New test.

From-SVN: r230928
parent bf8e1b52
2015-11-26 Jakub Jelinek <jakub@redhat.com>
PR c++/68508
* cp-tree.h (cp_ubsan_maybe_instrument_downcast): Add INTYPE argument.
* cp-ubsan.c (cp_ubsan_maybe_instrument_downcast): Likewise. Use
it instead of or in addition to TREE_TYPE (op). Use
is_properly_derived_from, return NULL_TREE if TREE_TYPE (intype) and
TREE_TYPE (type) are the same type minus qualifiers.
* typeck.c (build_static_cast_1): Adjust callers.
2015-11-25 Martin Sebor <msebor@redhat.com> 2015-11-25 Martin Sebor <msebor@redhat.com>
PR c++/67876 PR c++/67876
......
...@@ -6854,7 +6854,7 @@ extern bool cilk_valid_spawn (tree); ...@@ -6854,7 +6854,7 @@ extern bool cilk_valid_spawn (tree);
/* In cp-ubsan.c */ /* In cp-ubsan.c */
extern void cp_ubsan_maybe_instrument_member_call (tree); extern void cp_ubsan_maybe_instrument_member_call (tree);
extern void cp_ubsan_instrument_member_accesses (tree *); extern void cp_ubsan_instrument_member_accesses (tree *);
extern tree cp_ubsan_maybe_instrument_downcast (location_t, tree, tree); extern tree cp_ubsan_maybe_instrument_downcast (location_t, tree, tree, tree);
extern tree cp_ubsan_maybe_instrument_cast_to_vbase (location_t, tree, tree); extern tree cp_ubsan_maybe_instrument_cast_to_vbase (location_t, tree, tree);
/* -- end of C++ */ /* -- end of C++ */
......
...@@ -243,13 +243,14 @@ cp_ubsan_instrument_member_accesses (tree *t_p) ...@@ -243,13 +243,14 @@ cp_ubsan_instrument_member_accesses (tree *t_p)
/* Instrument downcast. */ /* Instrument downcast. */
tree tree
cp_ubsan_maybe_instrument_downcast (location_t loc, tree type, tree op) cp_ubsan_maybe_instrument_downcast (location_t loc, tree type,
tree intype, tree op)
{ {
if (!POINTER_TYPE_P (type) if (!POINTER_TYPE_P (type)
|| !POINTER_TYPE_P (intype)
|| !POINTER_TYPE_P (TREE_TYPE (op)) || !POINTER_TYPE_P (TREE_TYPE (op))
|| !CLASS_TYPE_P (TREE_TYPE (type))
|| !CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (op))) || !CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (op)))
|| !DERIVED_FROM_P (TREE_TYPE (TREE_TYPE (op)), TREE_TYPE (type))) || !is_properly_derived_from (TREE_TYPE (type), TREE_TYPE (intype)))
return NULL_TREE; return NULL_TREE;
return cp_ubsan_maybe_instrument_vptr (loc, op, TREE_TYPE (type), true, return cp_ubsan_maybe_instrument_vptr (loc, op, TREE_TYPE (type), true,
......
...@@ -6590,7 +6590,8 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -6590,7 +6590,8 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
if (flag_sanitize & SANITIZE_VPTR) if (flag_sanitize & SANITIZE_VPTR)
{ {
tree ubsan_check tree ubsan_check
= cp_ubsan_maybe_instrument_downcast (input_location, type, expr); = cp_ubsan_maybe_instrument_downcast (input_location, type,
intype, expr);
if (ubsan_check) if (ubsan_check)
expr = ubsan_check; expr = ubsan_check;
} }
...@@ -6737,7 +6738,8 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -6737,7 +6738,8 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
if (flag_sanitize & SANITIZE_VPTR) if (flag_sanitize & SANITIZE_VPTR)
{ {
tree ubsan_check tree ubsan_check
= cp_ubsan_maybe_instrument_downcast (input_location, type, expr); = cp_ubsan_maybe_instrument_downcast (input_location, type,
intype, expr);
if (ubsan_check) if (ubsan_check)
expr = ubsan_check; expr = ubsan_check;
} }
......
2015-11-26 Jakub Jelinek <jakub@redhat.com>
PR c++/68508
* g++.dg/ubsan/pr68508.C: New test.
2015-11-25 Martin Sebor <msebor@redhat.com> 2015-11-25 Martin Sebor <msebor@redhat.com>
PR c++/67876 PR c++/67876
......
// PR c++/68508
// { dg-do compile }
// { dg-options "-std=c++14 -fsanitize=vptr" }
struct A
{
virtual int foo () { return 0; }
};
const A &
bar ()
{
static A x = A ();
return (x);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment