mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 03:25:54 -04:00

If we detect a built-in declaration for which we cannot derive a type matching the pattern in the Builtins.def file, we currently emit a warning that the respective header is needed. However, this is not necessarily the behavior we want as it has no connection to the location of the declaration (which can actually be in the header in question). Instead, this warning is generated - if we could not build the type for the pattern on file (for some reason). Here we should make the reason explicit. The actual problem is otherwise circumvented as the warning is misleading, see [0] for an example. - if we could not build the type for the pattern because we do not have a type on record, possible since D55483, we should not emit any warning. See [1] for a legitimate problem. This patch address both cases. For the "setjmp" family a new warning is introduced and for built-ins without type on record, so far "pthread_create", we do not emit the warning anymore. Also see: PR40692 [0] https://lkml.org/lkml/2019/1/11/718 [1] https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=235583 Differential Revision: https://reviews.llvm.org/D58091 llvm-svn: 367387
72 lines
2.6 KiB
C
72 lines
2.6 KiB
C
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
// RUN: not %clang_cc1 -fsyntax-only -ast-dump %s | FileCheck %s
|
|
|
|
void f() {
|
|
int *ptr = malloc(sizeof(int) * 10); // expected-warning{{implicitly declaring library function 'malloc' with type}} \
|
|
// expected-note{{include the header <stdlib.h> or explicitly provide a declaration for 'malloc'}} \
|
|
// expected-note{{'malloc' is a builtin with type 'void *}}
|
|
}
|
|
|
|
void *alloca(__SIZE_TYPE__); // redeclaration okay
|
|
|
|
int *calloc(__SIZE_TYPE__, __SIZE_TYPE__); // expected-warning{{incompatible redeclaration of library function 'calloc'}} \
|
|
// expected-note{{'calloc' is a builtin with type 'void *}}
|
|
|
|
|
|
void g(int malloc) { // okay: these aren't functions
|
|
int calloc = 1;
|
|
}
|
|
|
|
void h() {
|
|
int malloc(int); // expected-warning{{incompatible redeclaration of library function 'malloc'}}
|
|
int strcpy(int); // expected-warning{{incompatible redeclaration of library function 'strcpy'}} \
|
|
// expected-note{{'strcpy' is a builtin with type 'char *(char *, const char *)'}}
|
|
}
|
|
|
|
void f2() {
|
|
fprintf(0, "foo"); // expected-warning{{declaration of built-in function 'fprintf' requires inclusion of the header <stdio.h>}} \
|
|
expected-warning {{implicit declaration of function 'fprintf' is invalid in C99}}
|
|
}
|
|
|
|
// PR2892
|
|
void __builtin_object_size(); // expected-error{{conflicting types}} \
|
|
// expected-note{{'__builtin_object_size' is a builtin with type}}
|
|
|
|
int a[10];
|
|
|
|
int f0() {
|
|
return __builtin_object_size(&a); // expected-error {{too few arguments to function}}
|
|
}
|
|
|
|
void * realloc(void *p, int size) { // expected-warning{{incompatible redeclaration of library function 'realloc'}} \
|
|
// expected-note{{'realloc' is a builtin with type 'void *(void *,}}
|
|
return p;
|
|
}
|
|
|
|
// PR3855
|
|
void snprintf(); // expected-warning{{incompatible redeclaration of library function 'snprintf'}} \
|
|
// expected-note{{'snprintf' is a builtin}}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
snprintf();
|
|
}
|
|
|
|
void snprintf() { }
|
|
|
|
// PR8316 & PR40692
|
|
void longjmp(); // expected-warning{{declaration of built-in function 'longjmp' requires the declaration of the 'jmp_buf' type, commonly provided in the header <setjmp.h>.}}
|
|
|
|
extern float fmaxf(float, float);
|
|
|
|
struct __jmp_buf_tag {};
|
|
void sigsetjmp(struct __jmp_buf_tag[1], int); // expected-warning{{declaration of built-in function 'sigsetjmp' requires the declaration of the 'jmp_buf' type, commonly provided in the header <setjmp.h>.}}
|
|
|
|
// CHECK: FunctionDecl {{.*}} <line:[[@LINE-2]]:1, col:44> col:6 sigsetjmp '
|
|
// CHECK-NOT: FunctionDecl
|
|
// CHECK: ReturnsTwiceAttr {{.*}} <{{.*}}> Implicit
|
|
|
|
// PR40692
|
|
void pthread_create(); // no warning expected
|