Fixes <rdar://problem/15584219> and <rdar://problem/12241361>. This change looks large, but all it does is reuse and consolidate the delayed diagnostic logic for deprecation warnings with unavailability warnings. By doing so, it showed various inconsistencies between the diagnostics, which were close, but not consistent. It also revealed some missing "note:"'s in the deprecated diagnostics that were showing up in the unavailable diagnostics, etc. This change also changes the wording of the core deprecation diagnostics. Instead of saying "function has been explicitly marked deprecated" we now saw "'X' has been been explicitly marked deprecated". It turns out providing a bit more context is useful, and often we got the actual term wrong or it was not very precise (e.g., "function" instead of "destructor"). By just saying the name of the thing that is deprecated/deleted/unavailable we define this issue away. This diagnostic can likely be further wordsmithed to be shorter. llvm-svn: 197627
49 lines
1.7 KiB
C
49 lines
1.7 KiB
C
// RUN: %clang_cc1 %s -verify -fsyntax-only
|
|
|
|
void c1(int *a);
|
|
|
|
extern int g1 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
|
|
int g2 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
|
|
static int g3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
|
|
|
|
void t1()
|
|
{
|
|
int v1 __attribute((cleanup)); // expected-error {{'cleanup' attribute takes one argument}}
|
|
int v2 __attribute((cleanup(1, 2))); // expected-error {{'cleanup' attribute takes one argument}}
|
|
|
|
static int v3 __attribute((cleanup(c1))); // expected-warning {{'cleanup' attribute ignored}}
|
|
|
|
int v4 __attribute((cleanup(h))); // expected-error {{use of undeclared identifier 'h'}}
|
|
|
|
int v5 __attribute((cleanup(c1)));
|
|
int v6 __attribute((cleanup(v3))); // expected-error {{'cleanup' argument 'v3' is not a function}}
|
|
}
|
|
|
|
struct s {
|
|
int a, b;
|
|
};
|
|
|
|
void c2();
|
|
void c3(struct s a);
|
|
|
|
void t2()
|
|
{
|
|
int v1 __attribute__((cleanup(c2))); // expected-error {{'cleanup' function 'c2' must take 1 parameter}}
|
|
int v2 __attribute__((cleanup(c3))); // expected-error {{'cleanup' function 'c3' parameter has type 'struct s' which is incompatible with type 'int *'}}
|
|
}
|
|
|
|
// This is a manufactured testcase, but gcc accepts it...
|
|
void c4(_Bool a);
|
|
void t4() {
|
|
__attribute((cleanup(c4))) void* g;
|
|
}
|
|
|
|
void c5(void*) __attribute__((deprecated)); // expected-note{{'c5' has been explicitly marked deprecated here}}
|
|
void t5() {
|
|
int i __attribute__((cleanup(c5))); // expected-warning {{'c5' is deprecated}}
|
|
}
|
|
|
|
void t6(void) {
|
|
int i __attribute__((cleanup((void *)0))); // expected-error {{'cleanup' argument is not a function}}
|
|
}
|