https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63956
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Marek Polacek from comment #6) > Earlier today I tried the following and it seemed to work, but I don't know > constexpr.c, so it may be totally bogus. > > --- gcc/cp/constexpr.c > +++ gcc/cp/constexpr.c > @@ -1149,6 +1149,10 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, > tree t, > constexpr_call *entry; > bool depth_ok; > > + if (fun == NULL_TREE > + && CALL_EXPR_IFN (t) == IFN_UBSAN_NULL) > + return t; > + > if (TREE_CODE (fun) != FUNCTION_DECL) > { > /* Might be a constexpr function pointer. */ The -fsanitize=vptr patch has: if (is_builtin_fn (fun)) - return cxx_eval_builtin_function_call (old_call, t, allow_non_constant, - addr, non_constant_p, overflow_p); + { + /* Ignore -fsanitize=vptr instrumentation. */ + if ((flag_sanitize & SANITIZE_VPTR) + && DECL_BUILT_IN_CLASS (fun) == BUILT_IN_NORMAL + && (DECL_FUNCTION_CODE (fun) + == ((flag_sanitize_recover & SANITIZE_VPTR) + ? BUILT_IN_UBSAN_HANDLE_DYNAMIC_TYPE_CACHE_MISS + : BUILT_IN_UBSAN_HANDLE_DYNAMIC_TYPE_CACHE_MISS_ABORT)) + && call_expr_nargs (t) == 4) + return void_node; + + return cxx_eval_builtin_function_call (old_call, t, allow_non_constant, + addr, non_constant_p, overflow_p); + } hunk in it to ignore __builtin___ubsan_handle_dynamic_type_cache_miss*. For fun == NULL_TREE, guess what you want is a switch on the CALL_EXPR_IFN value and enumerate there all the internal calls and elsewhere builtins that should be ignored.