--EXPECTF--
Exception: Cannot call abstract method C::foo() in %sexception_017.php on line %d
-Exception: Argument 1 passed to foo() must be callable, string given, called in %sexception_017.php on line %d
-Exception: Cannot call abstract method C::foo()
+Exception: Argument 1 passed to foo() must be callable, string given, called in %s on line %d
Fatal error: Uncaught Error: Cannot call abstract method C::foo() in %sexception_017.php:%d
Stack trace:
--- /dev/null
+--TEST--
+A "non well formed" notice converted to exception should result in a ZPP failure
+--FILE--
+<?php
+
+set_error_handler(function($_, $msg) {
+ throw new Exception($msg);
+}, E_NOTICE);
+
+try {
+ wordwrap("foo", "123foo", "");
+} catch (Exception $e) {
+ echo $e, "\n";
+}
+
+?>
+--EXPECTF--
+Exception: A non well formed numeric value encountered in %s:%d
+Stack trace:
+#0 [internal function]: {closure}(%s)
+#1 %s(%d): wordwrap('foo', '123foo', '')
+#2 {main}
return 0;
}
}
+ if (UNEXPECTED(EG(exception))) {
+ return 0;
+ }
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
*dest = 0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
return 0;
}
}
+ if (UNEXPECTED(EG(exception))) {
+ return 0;
+ }
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
*dest = 0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
return 0;
}
}
+ if (UNEXPECTED(EG(exception))) {
+ return 0;
+ }
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
*dest = 0.0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
if (retval) {
if (fcc->calling_scope && !call_via_handler) {
if (fcc->function_handler->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ retval = 0;
if (error) {
zend_spprintf(error, 0, "cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
- retval = 0;
- } else {
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
- retval = 0;
}
} else if (!fcc->object && !(fcc->function_handler->common.fn_flags & ZEND_ACC_STATIC)) {
int severity;
const char *fname, *fsep, *fclass;
const char *need_msg, *need_kind, *need_or_null, *given_msg, *given_kind;
+ if (EG(exception)) {
+ /* The type verification itself might have already thrown an exception
+ * through a promoted warning. */
+ return;
+ }
+
if (value) {
zend_verify_type_error_common(
zf, arg_info, ce, value,
}
if (allow_errors == -1) {
zend_error(E_NOTICE, "A non well formed numeric value encountered");
+ if (EG(exception)) {
+ return 0;
+ }
}
}
zval *param = EX_VAR(opline->result.var);
SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)))) {
HANDLE_EXCEPTION();
}
}
zval *default_value = RT_CONSTANT(opline, opline->op2);
SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)) || EG(exception))) {
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)))) {
HANDLE_EXCEPTION();
}
}
zval *default_value = RT_CONSTANT(opline, opline->op2);
SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)) || EG(exception))) {
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)))) {
HANDLE_EXCEPTION();
}
}
zval *param = EX_VAR(opline->result.var);
SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)))) {
HANDLE_EXCEPTION();
}
}