diff options
author | Ted Kremenek <kremenek@apple.com> | 2013-12-18 23:30:06 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2013-12-18 23:30:06 +0000 |
commit | 00374d1830d1adae1326446243166b380bbbae53 (patch) | |
tree | 015f57f7fc717a1278ff6ba26506f0d5dcb87de6 /test/SemaCXX/attr-unavailable.cpp | |
parent | 227d2056fae4273e90c18301ac0b1c9a3b66d5d5 (diff) |
Implemented delayed processing of 'unavailable' checking, just like with 'deprecated'.
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197627 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaCXX/attr-unavailable.cpp')
-rw-r--r-- | test/SemaCXX/attr-unavailable.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/test/SemaCXX/attr-unavailable.cpp b/test/SemaCXX/attr-unavailable.cpp index 2d82668a20..51dc8fe378 100644 --- a/test/SemaCXX/attr-unavailable.cpp +++ b/test/SemaCXX/attr-unavailable.cpp @@ -3,7 +3,7 @@ int &foo(int); // expected-note {{candidate}} double &foo(double); // expected-note {{candidate}} void foo(...) __attribute__((__unavailable__)); // expected-note {{candidate function}} \ -// expected-note{{function has been explicitly marked unavailable here}} +// expected-note{{'foo' has been explicitly marked unavailable here}} void bar(...) __attribute__((__unavailable__)); // expected-note 2{{explicitly marked unavailable}} @@ -37,3 +37,22 @@ void unavail(short* sp) { foo(sp); foo(); } + +// Show that delayed processing of 'unavailable' is the same +// delayed process for 'deprecated'. +// <rdar://problem/12241361> and <rdar://problem/15584219> +enum DeprecatedEnum { DE_A, DE_B } __attribute__((deprecated)); // expected-note {{'DeprecatedEnum' has been explicitly marked deprecated here}} +__attribute__((deprecated)) typedef enum DeprecatedEnum DeprecatedEnum; +typedef enum DeprecatedEnum AnotherDeprecatedEnum; // expected-warning {{'DeprecatedEnum' is deprecated}} + +__attribute__((deprecated)) +DeprecatedEnum testDeprecated(DeprecatedEnum X) { return X; } + + +enum UnavailableEnum { UE_A, UE_B } __attribute__((unavailable)); // expected-note {{'UnavailableEnum' has been explicitly marked unavailable here}} +__attribute__((unavailable)) typedef enum UnavailableEnum UnavailableEnum; +typedef enum UnavailableEnum AnotherUnavailableEnum; // expected-error {{'UnavailableEnum' is unavailable}} + + +__attribute__((unavailable)) +UnavailableEnum testUnavailable(UnavailableEnum X) { return X; } |