]> granicus.if.org Git - php/commitdiff
made Visual Studio to understand that zend_error_noreturn() will not return
authorAnatol Belski <ab@php.net>
Mon, 8 Sep 2014 18:34:26 +0000 (20:34 +0200)
committerAnatol Belski <ab@php.net>
Mon, 8 Sep 2014 18:34:26 +0000 (20:34 +0200)
- windows only, on linux gcc would cause a warning that the function returns,
  as no noreturn functions are used
- ZEND_NORETURN works on windows as well now, using __declspec(noreturn),
  which is useful for the other cases
- one more function call will be needed, which is not critical for the
  error reporting
- the way is open to enable the same for gcc as soon as it's not causing a warning

Zend/zend.c
Zend/zend.h

index 334a8df29b89a3db4270a9f63dc8bfbc150ed6c9..de131086731b8a38308cdb3957d3783e602c928c 100644 (file)
@@ -1031,11 +1031,17 @@ ZEND_API zval *zend_get_configuration_directive(zend_string *name) /* {{{ */
                } \
        } while (0)
 
+#ifndef ZEND_WIN32
 ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
+#else
+static void zend_error_va_list(int type, const char *format, va_list args)
+#endif
 {
        char *str;
        int len;
+#ifndef ZEND_WIN32
        va_list args;
+#endif
        va_list usr_copy;
        zval params[5];
        zval retval;
@@ -1138,7 +1144,9 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
        }
 #endif /* HAVE_DTRACE */
 
+#ifndef ZEND_WIN32
        va_start(args, format);
+#endif
 
        /* if we don't have a user defined error handler */
        if (Z_TYPE(EG(user_error_handler)) == IS_UNDEF
@@ -1249,7 +1257,9 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
                        break;
        }
 
+#ifndef ZEND_WIN32
        va_end(args);
+#endif
 
        if (type == E_PARSE) {
                /* eval() errors do not affect exit_status */
@@ -1266,6 +1276,24 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
 
 #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__)
 void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((alias("zend_error"),noreturn));
+#elif defined(ZEND_WIN32)
+ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
+{
+       va_list va;
+
+       va_start(va, format);
+       zend_error_va_list(type, format, va);
+       va_end(va);
+}
+
+ZEND_API ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...)
+{
+       va_list va;
+
+       va_start(va, format);
+       zend_error_va_list(type, format, va);
+       va_end(va);
+}
 #endif
 
 ZEND_API void zend_output_debug_string(zend_bool trigger_break, const char *format, ...) /* {{{ */
index a0d8ba9e0cc9287be47749f9ac7da81cc4c8ba61..d79920fb1e2b6aac419f79e52c9c76ef7919e75e 100644 (file)
@@ -309,6 +309,9 @@ typedef enum {
 #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__)
 #  define ZEND_NORETURN __attribute__((noreturn))
 void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((noreturn));
+#elif defined(ZEND_WIN32)
+#  define ZEND_NORETURN __declspec(noreturn)
+ZEND_API ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...);
 #else
 #  define ZEND_NORETURN
 #  define zend_error_noreturn zend_error