Skip to content

[Sema] Warning for _Float16 passed to format specifier '%f' #74439

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion clang/lib/AST/FormatString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,6 @@ ArgType::matchesType(ASTContext &C, QualType argTy) const {
return NoMatchPromotionTypeConfusion;
break;
case BuiltinType::Half:
case BuiltinType::Float16:
case BuiltinType::Float:
if (T == C.DoubleTy)
return MatchPromotion;
Expand Down
7 changes: 7 additions & 0 deletions clang/test/Sema/attr-format.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ typedef const char *xpto;
void j(xpto c, va_list list) __attribute__((format(printf, 1, 0))); // no-error
void k(xpto c) __attribute__((format(printf, 1, 0))); // no-error

void l(char *a, _Float16 b) __attribute__((format(printf, 1, 2))); // expected-warning {{GCC requires a function with the 'format' attribute to be variadic}}

void y(char *str) __attribute__((format(strftime, 1, 0))); // no-error
void z(char *str, int c, ...) __attribute__((format(strftime, 1, 2))); // expected-error {{strftime format attribute requires 3rd parameter to be 0}}

Expand Down Expand Up @@ -93,6 +95,11 @@ void call_nonvariadic(void) {
d3("%s", 123); // expected-warning{{format specifies type 'char *' but the argument has type 'int'}}
}

void call_no_default_promotion(void) {
a("%f", (_Float16)1.0); // expected-warning{{format specifies type 'double' but the argument has type '_Float16'}}
l("%f", (_Float16)1.0); // expected-warning{{format specifies type 'double' but the argument has type '_Float16'}}
}

__attribute__((format(printf, 1, 2)))
void forward_fixed(const char *fmt, _Bool b, char i, short j, int k, float l, double m) { // expected-warning{{GCC requires a function with the 'format' attribute to be variadic}}
forward_fixed(fmt, b, i, j, k, l, m);
Expand Down
1 change: 1 addition & 0 deletions clang/test/SemaCXX/attr-format.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ void do_format() {

format("%c %c %hhd %hd %d\n", (char)'a', 'a', 'a', (short)123, (int)123);
format("%f %f %f\n", (__fp16)123.f, 123.f, 123.);
format("%f", (_Float16)123.f);// expected-warning{{format specifies type 'double' but the argument has type '_Float16'}}
format("%Lf", (__fp16)123.f); // expected-warning{{format specifies type 'long double' but the argument has type '__fp16'}}
format("%Lf", 123.f); // expected-warning{{format specifies type 'long double' but the argument has type 'float'}}
format("%hhi %hhu %hi %hu %i %u", b, b, b, b, b, b);
Expand Down
16 changes: 10 additions & 6 deletions clang/test/SemaCXX/format-strings-scanf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ union bag {
unsigned long long ull;
signed long long sll;
__fp16 f16;
_Float16 Float16;
float ff;
double fd;
long double fl;
Expand Down Expand Up @@ -51,18 +52,21 @@ void test(void) {
// expected-warning@+1{{format specifies type 'int *' but the argument has type 'short *'}}
scan("%hhi %i %li", &b.ss, &b.ss, &b.ss);

// expected-warning@+3{{format specifies type 'float *' but the argument has type '__fp16 *'}}
// expected-warning@+4{{format specifies type 'float *' but the argument has type '__fp16 *'}}
// expected-warning@+3{{format specifies type 'float *' but the argument has type '_Float16 *'}}
// expected-warning@+2{{format specifies type 'float *' but the argument has type 'double *'}}
// expected-warning@+1{{format specifies type 'float *' but the argument has type 'long double *'}}
scan("%f %f %f", &b.f16, &b.fd, &b.fl);
scan("%f %f %f %f", &b.f16, &b.Float16, &b.fd, &b.fl);

// expected-warning@+3{{format specifies type 'double *' but the argument has type '__fp16 *'}}
// expected-warning@+4{{format specifies type 'double *' but the argument has type '__fp16 *'}}
// expected-warning@+3{{format specifies type 'double *' but the argument has type '_Float16 *'}}
// expected-warning@+2{{format specifies type 'double *' but the argument has type 'float *'}}
// expected-warning@+1{{format specifies type 'double *' but the argument has type 'long double *'}}
scan("%lf %lf %lf", &b.f16, &b.ff, &b.fl);
scan("%lf %lf %lf %lf", &b.f16, &b.Float16, &b.ff, &b.fl);

// expected-warning@+3{{format specifies type 'long double *' but the argument has type '__fp16 *'}}
// expected-warning@+4{{format specifies type 'long double *' but the argument has type '__fp16 *'}}
// expected-warning@+3{{format specifies type 'long double *' but the argument has type '_Float16 *'}}
// expected-warning@+2{{format specifies type 'long double *' but the argument has type 'float *'}}
// expected-warning@+1{{format specifies type 'long double *' but the argument has type 'double *'}}
scan("%Lf %Lf %Lf", &b.f16, &b.ff, &b.fd);
scan("%Lf %Lf %Lf %Lf", &b.f16, &b.Float16, &b.ff, &b.fd);
}