From: Marek Polacek Date: Tue, 7 Oct 2014 17:49:46 +0000 (+0000) Subject: re PR c/59717 (better warning when using functions without including appropriate... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0382aaa033235ef268e234700355434690993c29;p=gcc.git re PR c/59717 (better warning when using functions without including appropriate header files) PR c/59717 * c-decl.c (header_for_builtin_fn): New function. (implicitly_declare): Suggest which header to include. * gcc.dg/pr59717.c: New test. From-SVN: r215979 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index ec75d9807e9..3a09125b15d 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2014-10-07 Marek Polacek + + PR c/59717 + * c-decl.c (header_for_builtin_fn): New function. + (implicitly_declare): Suggest which header to include. + 2014-10-07 Marek Polacek * c-convert.c (convert): Use error_operand_p. diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index ce5a8deecb8..e23284a6cf0 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2968,6 +2968,189 @@ implicit_decl_warning (location_t loc, tree id, tree olddecl) } } +/* This function represents mapping of a function code FCODE + to its respective header. */ + +static const char * +header_for_builtin_fn (enum built_in_function fcode) +{ + switch (fcode) + { + CASE_FLT_FN (BUILT_IN_ACOS): + CASE_FLT_FN (BUILT_IN_ACOSH): + CASE_FLT_FN (BUILT_IN_ASIN): + CASE_FLT_FN (BUILT_IN_ASINH): + CASE_FLT_FN (BUILT_IN_ATAN): + CASE_FLT_FN (BUILT_IN_ATANH): + CASE_FLT_FN (BUILT_IN_ATAN2): + CASE_FLT_FN (BUILT_IN_CBRT): + CASE_FLT_FN (BUILT_IN_CEIL): + CASE_FLT_FN (BUILT_IN_COPYSIGN): + CASE_FLT_FN (BUILT_IN_COS): + CASE_FLT_FN (BUILT_IN_COSH): + CASE_FLT_FN (BUILT_IN_ERF): + CASE_FLT_FN (BUILT_IN_ERFC): + CASE_FLT_FN (BUILT_IN_EXP): + CASE_FLT_FN (BUILT_IN_EXP2): + CASE_FLT_FN (BUILT_IN_EXPM1): + CASE_FLT_FN (BUILT_IN_FABS): + CASE_FLT_FN (BUILT_IN_FDIM): + CASE_FLT_FN (BUILT_IN_FLOOR): + CASE_FLT_FN (BUILT_IN_FMA): + CASE_FLT_FN (BUILT_IN_FMAX): + CASE_FLT_FN (BUILT_IN_FMIN): + CASE_FLT_FN (BUILT_IN_FMOD): + CASE_FLT_FN (BUILT_IN_FREXP): + CASE_FLT_FN (BUILT_IN_HYPOT): + CASE_FLT_FN (BUILT_IN_ILOGB): + CASE_FLT_FN (BUILT_IN_LDEXP): + CASE_FLT_FN (BUILT_IN_LGAMMA): + CASE_FLT_FN (BUILT_IN_LLRINT): + CASE_FLT_FN (BUILT_IN_LLROUND): + CASE_FLT_FN (BUILT_IN_LOG): + CASE_FLT_FN (BUILT_IN_LOG10): + CASE_FLT_FN (BUILT_IN_LOG1P): + CASE_FLT_FN (BUILT_IN_LOG2): + CASE_FLT_FN (BUILT_IN_LOGB): + CASE_FLT_FN (BUILT_IN_LRINT): + CASE_FLT_FN (BUILT_IN_LROUND): + CASE_FLT_FN (BUILT_IN_MODF): + CASE_FLT_FN (BUILT_IN_NAN): + CASE_FLT_FN (BUILT_IN_NEARBYINT): + CASE_FLT_FN (BUILT_IN_NEXTAFTER): + CASE_FLT_FN (BUILT_IN_NEXTTOWARD): + CASE_FLT_FN (BUILT_IN_POW): + CASE_FLT_FN (BUILT_IN_REMAINDER): + CASE_FLT_FN (BUILT_IN_REMQUO): + CASE_FLT_FN (BUILT_IN_RINT): + CASE_FLT_FN (BUILT_IN_ROUND): + CASE_FLT_FN (BUILT_IN_SCALBLN): + CASE_FLT_FN (BUILT_IN_SCALBN): + CASE_FLT_FN (BUILT_IN_SIN): + CASE_FLT_FN (BUILT_IN_SINH): + CASE_FLT_FN (BUILT_IN_SINCOS): + CASE_FLT_FN (BUILT_IN_SQRT): + CASE_FLT_FN (BUILT_IN_TAN): + CASE_FLT_FN (BUILT_IN_TANH): + CASE_FLT_FN (BUILT_IN_TGAMMA): + CASE_FLT_FN (BUILT_IN_TRUNC): + case BUILT_IN_ISINF: + case BUILT_IN_ISNAN: + return ""; + CASE_FLT_FN (BUILT_IN_CABS): + CASE_FLT_FN (BUILT_IN_CACOS): + CASE_FLT_FN (BUILT_IN_CACOSH): + CASE_FLT_FN (BUILT_IN_CARG): + CASE_FLT_FN (BUILT_IN_CASIN): + CASE_FLT_FN (BUILT_IN_CASINH): + CASE_FLT_FN (BUILT_IN_CATAN): + CASE_FLT_FN (BUILT_IN_CATANH): + CASE_FLT_FN (BUILT_IN_CCOS): + CASE_FLT_FN (BUILT_IN_CCOSH): + CASE_FLT_FN (BUILT_IN_CEXP): + CASE_FLT_FN (BUILT_IN_CIMAG): + CASE_FLT_FN (BUILT_IN_CLOG): + CASE_FLT_FN (BUILT_IN_CONJ): + CASE_FLT_FN (BUILT_IN_CPOW): + CASE_FLT_FN (BUILT_IN_CPROJ): + CASE_FLT_FN (BUILT_IN_CREAL): + CASE_FLT_FN (BUILT_IN_CSIN): + CASE_FLT_FN (BUILT_IN_CSINH): + CASE_FLT_FN (BUILT_IN_CSQRT): + CASE_FLT_FN (BUILT_IN_CTAN): + CASE_FLT_FN (BUILT_IN_CTANH): + return ""; + case BUILT_IN_MEMCHR: + case BUILT_IN_MEMCMP: + case BUILT_IN_MEMCPY: + case BUILT_IN_MEMMOVE: + case BUILT_IN_MEMSET: + case BUILT_IN_STRCAT: + case BUILT_IN_STRCHR: + case BUILT_IN_STRCMP: + case BUILT_IN_STRCPY: + case BUILT_IN_STRCSPN: + case BUILT_IN_STRLEN: + case BUILT_IN_STRNCAT: + case BUILT_IN_STRNCMP: + case BUILT_IN_STRNCPY: + case BUILT_IN_STRPBRK: + case BUILT_IN_STRRCHR: + case BUILT_IN_STRSPN: + case BUILT_IN_STRSTR: + return ""; + case BUILT_IN_FPRINTF: + case BUILT_IN_PUTC: + case BUILT_IN_FPUTC: + case BUILT_IN_FPUTS: + case BUILT_IN_FSCANF: + case BUILT_IN_FWRITE: + case BUILT_IN_PRINTF: + case BUILT_IN_PUTCHAR: + case BUILT_IN_PUTS: + case BUILT_IN_SCANF: + case BUILT_IN_SNPRINTF: + case BUILT_IN_SPRINTF: + case BUILT_IN_SSCANF: + case BUILT_IN_VFPRINTF: + case BUILT_IN_VFSCANF: + case BUILT_IN_VPRINTF: + case BUILT_IN_VSCANF: + case BUILT_IN_VSNPRINTF: + case BUILT_IN_VSPRINTF: + case BUILT_IN_VSSCANF: + return ""; + case BUILT_IN_ISALNUM: + case BUILT_IN_ISALPHA: + case BUILT_IN_ISBLANK: + case BUILT_IN_ISCNTRL: + case BUILT_IN_ISDIGIT: + case BUILT_IN_ISGRAPH: + case BUILT_IN_ISLOWER: + case BUILT_IN_ISPRINT: + case BUILT_IN_ISPUNCT: + case BUILT_IN_ISSPACE: + case BUILT_IN_ISUPPER: + case BUILT_IN_ISXDIGIT: + case BUILT_IN_TOLOWER: + case BUILT_IN_TOUPPER: + return ""; + case BUILT_IN_ISWALNUM: + case BUILT_IN_ISWALPHA: + case BUILT_IN_ISWBLANK: + case BUILT_IN_ISWCNTRL: + case BUILT_IN_ISWDIGIT: + case BUILT_IN_ISWGRAPH: + case BUILT_IN_ISWLOWER: + case BUILT_IN_ISWPRINT: + case BUILT_IN_ISWPUNCT: + case BUILT_IN_ISWSPACE: + case BUILT_IN_ISWUPPER: + case BUILT_IN_ISWXDIGIT: + case BUILT_IN_TOWLOWER: + case BUILT_IN_TOWUPPER: + return ""; + case BUILT_IN_ABORT: + case BUILT_IN_ABS: + case BUILT_IN_CALLOC: + case BUILT_IN_EXIT: + case BUILT_IN_FREE: + case BUILT_IN_LABS: + case BUILT_IN_LLABS: + case BUILT_IN_MALLOC: + case BUILT_IN_REALLOC: + case BUILT_IN__EXIT2: + case BUILT_IN_ALIGNED_ALLOC: + return ""; + case BUILT_IN_IMAXABS: + return ""; + case BUILT_IN_STRFTIME: + return ""; + default: + return NULL; + } +} + /* Generate an implicit declaration for identifier FUNCTIONID at LOC as a function of type int (). */ @@ -3025,8 +3208,15 @@ implicitly_declare (location_t loc, tree functionid) (TREE_TYPE (decl))); if (!comptypes (newtype, TREE_TYPE (decl))) { - warning_at (loc, 0, "incompatible implicit declaration of " - "built-in function %qD", decl); + bool warned = warning_at (loc, 0, "incompatible implicit " + "declaration of built-in " + "function %qD", decl); + /* See if we can hint which header to include. */ + const char *header + = header_for_builtin_fn (DECL_FUNCTION_CODE (decl)); + if (header != NULL && warned) + inform (loc, "include %qs or provide a declaration of %qD", + header, decl); newtype = TREE_TYPE (decl); } } @@ -3034,7 +3224,8 @@ implicitly_declare (location_t loc, tree functionid) { if (!comptypes (newtype, TREE_TYPE (decl))) { - error_at (loc, "incompatible implicit declaration of function %qD", decl); + error_at (loc, "incompatible implicit declaration of " + "function %qD", decl); locate_old_decl (decl); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 32cc63017e1..dfc9a8bf7cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-10-07 Marek Polacek + + PR c/59717 + * gcc.dg/pr59717.c: New test. + 2014-10-07 Marek Polacek * gcc.dg/guality/pr41616-1.c: Use -fgnu89-inline. diff --git a/gcc/testsuite/gcc.dg/pr59717.c b/gcc/testsuite/gcc.dg/pr59717.c new file mode 100644 index 00000000000..948180c004a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr59717.c @@ -0,0 +1,277 @@ +/* PR c/59717 */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu11 -Wno-implicit-function-declaration" } */ + +void +math (double d, int *ex, double *dp) +{ + acos (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 8 } */ + acosh (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 10 } */ + asin (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 12 } */ + asinh (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 14 } */ + atan (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 16 } */ + atanh (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 18 } */ + atan2 (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 20 } */ + cbrt (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 22 } */ + ceil (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 24 } */ + copysign (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 26 } */ + cos (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 28 } */ + cosh (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 30 } */ + erf (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 32 } */ + erfc (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 34 } */ + exp (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 36 } */ + exp2 (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 38 } */ + expm1 (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 40 } */ + fabs (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 42 } */ + fdim (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 44 } */ + floor (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 46 } */ + fma (d, d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 48 } */ + fmax (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 50 } */ + fmin (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 52 } */ + fmod (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 54 } */ + frexp (d, ex); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 56 } */ + hypot (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 58 } */ + /* We don't generate the warning for ilogb. */ + ilogb (d); + ldexp (d, *ex); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 62 } */ + lgamma (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 64 } */ + llrint (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 66 } */ + llround (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 68 } */ + log (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 70 } */ + log10 (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 72 } */ + log1p (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 74 } */ + log2 (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 76 } */ + logb (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 78 } */ + lrint (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 80 } */ + lround (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 82 } */ + modf (d, dp); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 84 } */ + nan (""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 86 } */ + nearbyint (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 88 } */ + nextafter (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 90 } */ + nexttoward (d, 20.0L); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 92 } */ + pow (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 94 } */ + remainder (d, d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 96 } */ + remquo (d, d, ex); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 98 } */ + rint (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 100 } */ + round (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 102 } */ + scalbln (d, 100L); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 104 } */ + scalbn (d, 100); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 106 } */ + sin (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 108 } */ + sinh (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 110 } */ + sincos (d, dp, dp); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 112 } */ + sqrt (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 114 } */ + tan (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 116 } */ + tanh (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 118 } */ + tgamma (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 120 } */ + trunc (d); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..math.h.." "" { target *-*-* } 122 } */ +} + +void +cmplx (double _Complex z) +{ + cabs (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 129 } */ + cacos (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 131 } */ + cacosh (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 133 } */ + carg (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 135 } */ + casin (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 137 } */ + casinh (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 139 } */ + catan (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 141 } */ + catanh (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 143 } */ + ccos (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 145 } */ + ccosh (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 147 } */ + cexp (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 149 } */ + cimag (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 151 } */ + clog (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 153 } */ + conj (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 155 } */ + cpow (z, z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 157 } */ + cproj (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 159 } */ + creal (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 161 } */ + csin (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 163 } */ + csinh (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 165 } */ + csqrt (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 167 } */ + ctan (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 169 } */ + ctanh (z); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..complex.h.." "" { target *-*-* } 171 } */ +} + +void +string (void *p, void *q, __SIZE_TYPE__ sz) +{ + memchr (p, 2, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 178 } */ + /* We don't generate the warning for memcmp. */ + memcmp (p, q, sz); + memcpy (p, q, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 182 } */ + memmove (p, q, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 184 } */ + memset (p, 0, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 186 } */ + strcat (p, q); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 188 } */ + strchr (p, 'a'); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 190 } */ + /* We don't generate the warning for strcmp. */ + strcmp (p, q); + strcpy (p, q); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 194 } */ + strcspn (p, q); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 196 } */ + strlen (p); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 198 } */ + strncat (p, q, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 200 } */ + /* We don't generate the warning for strncmp. */ + strncmp (p, q, sz); + strncpy (p, q, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 204 } */ + strpbrk (p, q); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 206 } */ + strrchr (p, 'q'); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 208 } */ + strspn (p, q); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 210 } */ + strstr (p, q); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..string.h.." "" { target *-*-* } 212 } */ +} + +/* Fake FILE. */ +typedef struct { int i; } FILE; + +void +stdio (FILE *fp, void *p, __SIZE_TYPE__ sz) +{ + fprintf (fp, ""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 222 } */ + fscanf (fp, ""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 224 } */ + fwrite (p, sz, sz, fp); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 226 } */ + printf (""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 228 } */ + scanf (""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 230 } */ + snprintf ("", sz, ""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 232 } */ + sprintf ("", ""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 234 } */ + sscanf ("", ""); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdio.h.." "" { target *-*-* } 236 } */ +} + +void +stdlib (void *p, void *q, __SIZE_TYPE__ sz) +{ + abort (); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 243 } */ + calloc (sz, 1); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 245 } */ + exit (1); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 247 } */ + free (p); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 249 } */ + labs (1L); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 251 } */ + llabs (1LL); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 253 } */ + malloc (sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 255 } */ + realloc (p, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 257 } */ + aligned_alloc (sz, sz); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..stdlib.h.." "" { target *-*-* } 259 } */ +} + +void +inttypes (__INTMAX_TYPE__ j) +{ + imaxabs (j); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..inttypes.h.." "" { target *-*-* } 266 } */ +} + +struct tm; + +void +timeh (char *s, __SIZE_TYPE__ sz, struct tm *tm) +{ + strftime (s, sz, "", tm); /* { dg-warning "incompatible implicit" } */ + /* { dg-message "include ..time.h.." "" { target *-*-* } 275 } */ +}