mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 03:26:48 +00:00

Ignore the `[[malloc(x)]]` or `[[malloc(x, 1)]]` function attribute syntax added in [GCC 11][1] and print a warning instead of an error. Unlike `[[malloc]]` with no arguments (which is supported by Clang), GCC uses the one or two argument form to specify a deallocator for GCC's static analyzer. Code currently compiled with `[[malloc(x)]]` or `__attribute((malloc(x)))` fails with the following error: `'malloc' attribute takes no arguments`. [1]: https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;f=gcc/doc/extend.texi;h=dce6c58db87ebf7f4477bd3126228e73e4eeee97#patch6 Fixes: https://github.com/llvm/llvm-project/issues/51607 Partial-Bug: https://github.com/llvm/llvm-project/issues/53152
56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
// RUN: %clang_cc1 %s -ast-print -fms-extensions | FileCheck %s
|
|
|
|
// CHECK: int x __attribute__((aligned(4)));
|
|
int x __attribute__((aligned(4)));
|
|
|
|
// CHECK: __declspec(align(4)) int y;
|
|
__declspec(align(4)) int y;
|
|
|
|
// CHECK: int foo() __attribute__((const));
|
|
int foo() __attribute__((const));
|
|
|
|
// CHECK: int bar() __attribute__((__const));
|
|
int bar() __attribute__((__const));
|
|
|
|
// FIXME: Print this with correct format.
|
|
// CHECK: int foo1() __attribute__((noinline)) __attribute__((pure));
|
|
int foo1() __attribute__((noinline, pure));
|
|
|
|
// CHECK: typedef int Small1 __attribute__((mode(byte)));
|
|
typedef int Small1 __attribute__((mode(byte)));
|
|
|
|
// CHECK: int small __attribute__((mode(byte)));
|
|
int small __attribute__((mode(byte)));
|
|
|
|
// CHECK: int v __attribute__((visibility("hidden")));
|
|
int v __attribute__((visibility("hidden")));
|
|
|
|
// CHECK: char *PR24565() __attribute__((malloc))
|
|
char *PR24565() __attribute__((__malloc__));
|
|
|
|
void my_cleanup_func(char *);
|
|
|
|
// using __attribute__(malloc()) with args is currently ignored by Clang
|
|
// CHECK: char *PR52265_a()
|
|
__attribute__((malloc(my_cleanup_func))) char *PR52265_a();
|
|
// CHECK: char *PR52265_b()
|
|
__attribute__((malloc(my_cleanup_func, 1))) char *PR52265_b();
|
|
|
|
// CHECK: class __attribute__((consumable("unknown"))) AttrTester1
|
|
class __attribute__((consumable(unknown))) AttrTester1 {
|
|
// CHECK: void callableWhen() __attribute__((callable_when("unconsumed", "consumed")));
|
|
void callableWhen() __attribute__((callable_when("unconsumed", "consumed")));
|
|
};
|
|
|
|
// CHECK: class __single_inheritance SingleInheritance;
|
|
class __single_inheritance SingleInheritance;
|
|
|
|
// CHECK: class __multiple_inheritance MultipleInheritance;
|
|
class __multiple_inheritance MultipleInheritance;
|
|
|
|
// CHECK: class __virtual_inheritance VirtualInheritance;
|
|
class __virtual_inheritance VirtualInheritance;
|
|
|
|
// CHECK: typedef double *aligned_double __attribute__((align_value(64)));
|
|
typedef double * __attribute__((align_value(64))) aligned_double;
|