Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/Wbuiltin-declaration-mismatch-4.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:84e7813d76e9 | 145:1830386684a0 |
---|---|
1 /* PR c/83656 - missing -Wbuiltin-declaration-mismatch on declaration | |
2 without prototype | |
3 { dg-do compile } | |
4 { dg-options "-Wbuiltin-declaration-mismatch" } */ | |
5 | |
6 typedef __PTRDIFF_TYPE__ ptrdiff_t; | |
7 typedef __SIZE_TYPE__ size_t; | |
8 | |
9 char c; | |
10 signed char sc; | |
11 unsigned char uc; | |
12 short si; | |
13 unsigned short usi; | |
14 int i; | |
15 unsigned ui; | |
16 long li; | |
17 unsigned long uli; | |
18 | |
19 size_t szi; | |
20 typedef size_t SizeType; | |
21 SizeType szti; | |
22 | |
23 ptrdiff_t diffi; | |
24 | |
25 enum E { e0 } e; | |
26 | |
27 float f; | |
28 double d; | |
29 long double ld; | |
30 | |
31 | |
32 /* Verify warnings for undefined calls to built-ins expecting integer | |
33 arguments. */ | |
34 | |
35 int abs (); /* { dg-message "built-in .abs. declared here" } */ | |
36 | |
37 void test_integer_conversion_abs (void) | |
38 { | |
39 i = abs (c); | |
40 i = abs (sc); | |
41 i = abs (uc); | |
42 | |
43 i = abs (si); | |
44 i = abs (usi); | |
45 | |
46 i = abs (i); | |
47 i = abs (ui); /* { dg-warning ".abs. argument 1 type is .unsigned int. where .int. is expected in a call to built-in function declared without prototype" } */ | |
48 | |
49 /* Verify that the same call as above but to the built-in doesn't | |
50 trigger a warning. */ | |
51 i = __builtin_abs (ui); | |
52 | |
53 i = abs (li); /* { dg-warning ".abs. argument 1 type is .long int. where .int. is expected in a call to built-in function declared without prototype" } */ | |
54 i = abs (uli); /* { dg-warning ".abs. argument 1 type is .long unsigned int. where .int. is expected in a call to built-in function declared without prototype" } */ | |
55 | |
56 i = abs (e0); | |
57 i = abs (e); | |
58 | |
59 i = abs (-1.0); /* { dg-warning ".abs. argument 1 type is .double. where .int. is expected in a call to built-in function declared without prototype" } */ | |
60 i = abs (f); /* { dg-warning ".abs. argument 1 promotes to .double. where .int. is expected in a call to built-in function declared without prototype" } */ | |
61 i = abs (ld); /* { dg-warning ".abs. argument 1 type is .long double. where .int. is expected in a call to built-in function declared without prototype" } */ | |
62 | |
63 /* Verify that the same call as above but to the built-in doesn't | |
64 trigger a warning. */ | |
65 i = __builtin_abs (ld); | |
66 } | |
67 | |
68 | |
69 extern void* memset (); | |
70 | |
71 void test_integer_conversion_memset (void *d) | |
72 { | |
73 memset (d, 0, sizeof (int)); | |
74 memset (d, '\0', szi); | |
75 memset (d, i, szti); | |
76 | |
77 /* Passing a ptrdiff_t where size_t is expected may not be unsafe | |
78 but because GCC may emits suboptimal code for such calls warning | |
79 for them helps improve efficiency. */ | |
80 memset (d, 0, diffi); /* { dg-warning ".memset. argument 3 promotes to .ptrdiff_t. {aka .\(long \)?int.} where .\(long \)?unsigned int. is expected" } */ | |
81 | |
82 memset (d, 0, 2.0); /* { dg-warning ".memset. argument 3 type is .double. where '\(long \)?unsigned int' is expected" } */ | |
83 | |
84 /* Verify that the same call as above but to the built-in doesn't | |
85 trigger a warning. */ | |
86 __builtin_memset (d, 0.0, 4.0); | |
87 } | |
88 | |
89 | |
90 /* Verify warnings for undefined calls to built-ins expecting floating | |
91 arguments. */ | |
92 | |
93 double fabs (); /* { dg-message "built-in .fabs. declared here" } */ | |
94 | |
95 /* Expect a warning for fabsf below because even a float argument promotes | |
96 to double. Unfortunately, invalid calls to fabsf() are not diagnosed. */ | |
97 float fabsf (); /* { dg-warning "conflicting types for built-in function .fabsf.; expected .float\\\(float\\\)." } */ | |
98 long double fabsl (); /* { dg-message "built-in .fabsl. declared here" } */ | |
99 | |
100 void test_real_conversion_fabs (void) | |
101 { | |
102 d = fabs (c); /* { dg-warning ".fabs. argument 1 promotes to .int. where .double. is expected in a call to built-in function declared without prototype" } */ | |
103 | |
104 d = fabs (i); /* { dg-warning ".fabs. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */ | |
105 | |
106 d = fabs (li); /* { dg-warning ".fabs. argument 1 type is .long int. where .double. is expected in a call to built-in function declared without prototype" } */ | |
107 | |
108 /* In C, the type of an enumeration constant is int. */ | |
109 d = fabs (e0); /* { dg-warning ".fabs. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */ | |
110 | |
111 d = fabs (e); /* { dg-warning ".fabs. argument 1 type is .enum E. where .double. is expected in a call to built-in function declared without prototype" "ordinary enum" { target { ! short_enums } } } */ | |
112 /* { dg-warning ".fabs. argument 1 promotes to .int. where .double. is expected in a call to built-in function declared without prototype" "size 1 enum" { target short_enums } .-1 } */ | |
113 | |
114 /* No warning here since float is promoted to double. */ | |
115 d = fabs (f); | |
116 | |
117 d = fabs (ld); /* { dg-warning ".fabs. argument 1 type is .long double. where .double. is expected in a call to built-in function declared without prototype" } */ | |
118 | |
119 d = fabsf (c); /* { dg-warning ".fabsf. argument 1 promotes to .int. where .float. is expected in a call to built-in function declared without prototype" "pr87890" { xfail *-*-* } } */ | |
120 | |
121 d = fabsl (c); /* { dg-warning ".fabsl. argument 1 promotes to .int. where .long double. is expected in a call to built-in function declared without prototype" } */ | |
122 | |
123 d = fabsl (f); /* { dg-warning ".fabsl. argument 1 promotes to .double. where .long double. is expected in a call to built-in function declared without prototype" } */ | |
124 | |
125 /* Verify that the same call as above but to the built-in doesn't | |
126 trigger a warning. */ | |
127 d = __builtin_fabsl (f); | |
128 } | |
129 | |
130 /* Verify warnings for calls to a two-argument real function. */ | |
131 | |
132 double pow (); /* { dg-message "built-in .pow. declared here" } */ | |
133 | |
134 void test_real_conversion_pow (void) | |
135 { | |
136 d = pow (2.0, 2.0); | |
137 d = pow (d, 3.0); | |
138 d = pow (d, d); | |
139 | |
140 d = pow (2, 3.0); /* { dg-warning ".pow. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */ | |
141 d = pow (3.0, 2); /* { dg-warning ".pow. argument 2 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */ | |
142 } | |
143 | |
144 | |
145 /* Verify warnings for calls that discard qualifiers. */ | |
146 | |
147 extern void* memcpy (); | |
148 | |
149 void test_qual_conversion_memcpy (void *d, const void *s) | |
150 { | |
151 memcpy (d, s, sizeof (int)); | |
152 memcpy (s, d, sizeof (int)); /* { dg-warning "passing argument 1 of .memcpy. discards 'const' qualifier from pointer target type" } */ | |
153 } |