fix incompatible pointer type for va_list in nano versions of printf and scanf for target like PowerPC
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							9588ff7555
						
					
				
				
					commit
					fcd33916ac
				
			| @@ -168,6 +168,16 @@ static char *rcsid = "$Id$"; | ||||
| #include "vfieeefp.h" | ||||
| #include "nano-vfprintf_local.h" | ||||
|  | ||||
|  | ||||
| /* GCC PR 14577 at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 */ | ||||
| #if __STDC_VERSION__ >= 201112L | ||||
| #define va_ptr(ap) _Generic(&(ap), va_list *: &(ap), default: (va_list *)(ap)) | ||||
| #elif __GNUC__ >= 4 | ||||
| #define va_ptr(ap) __builtin_choose_expr(__builtin_types_compatible_p(__typeof__(&(ap)), va_list *), &(ap), (va_list *)(ap)) | ||||
| #else | ||||
| #define va_ptr(ap) (sizeof(ap) == sizeof(va_list) ? (va_list *)&(ap) : (va_list *)(ap)) | ||||
| #endif | ||||
|  | ||||
| /* The __ssputs_r function is shared between all versions of vfprintf | ||||
|    and vfwprintf.  */ | ||||
| #ifdef STRING_ONLY | ||||
| @@ -633,12 +643,12 @@ _DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap), | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      n = _printf_float (data, &prt_data, fp, pfunc, &ap); | ||||
| 	      n = _printf_float (data, &prt_data, fp, pfunc, va_ptr(ap)); | ||||
| 	    } | ||||
| 	} | ||||
|       else | ||||
| #endif | ||||
| 	n = _printf_i (data, &prt_data, fp, pfunc, &ap); | ||||
| 	n = _printf_i (data, &prt_data, fp, pfunc, va_ptr(ap)); | ||||
|  | ||||
|       if (n == -1) | ||||
| 	goto error; | ||||
|   | ||||
| @@ -119,6 +119,15 @@ Supporting OS subroutines required: | ||||
| #include "../stdlib/local.h" | ||||
| #include "nano-vfscanf_local.h" | ||||
|  | ||||
| /* GCC PR 14577 at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 */ | ||||
| #if __STDC_VERSION__ >= 201112L | ||||
| #define va_ptr(ap) _Generic(&(ap), va_list *: &(ap), default: (va_list *)(ap)) | ||||
| #elif __GNUC__ >= 4 | ||||
| #define va_ptr(ap) __builtin_choose_expr(__builtin_types_compatible_p(__typeof__(&(ap)), va_list *), &(ap), (va_list *)(ap)) | ||||
| #else | ||||
| #define va_ptr(ap) (sizeof(ap) == sizeof(va_list) ? (va_list *)&(ap) : (va_list *)(ap)) | ||||
| #endif | ||||
|  | ||||
| #define VFSCANF vfscanf | ||||
| #define _VFSCANF_R _vfscanf_r | ||||
| #define __SVFSCANF __svfscanf | ||||
| @@ -424,12 +433,12 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap), | ||||
| 	} | ||||
|       ret = 0; | ||||
|       if (scan_data.code < CT_INT) | ||||
| 	ret = _scanf_chars (rptr, &scan_data, fp, &ap); | ||||
| 	ret = _scanf_chars (rptr, &scan_data, fp, va_ptr(ap)); | ||||
|       else if (scan_data.code < CT_FLOAT) | ||||
| 	ret = _scanf_i (rptr, &scan_data, fp, &ap); | ||||
| 	ret = _scanf_i (rptr, &scan_data, fp, va_ptr(ap)); | ||||
| #ifdef FLOATING_POINT | ||||
|       else if (_scanf_float) | ||||
| 	ret = _scanf_float (rptr, &scan_data, fp, &ap); | ||||
| 	ret = _scanf_float (rptr, &scan_data, fp, va_ptr(ap)); | ||||
| #endif | ||||
|  | ||||
|       if (ret == MATCH_FAILURE) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user