Skip to content

Commit

Permalink
[Clang] Enhance handling of [[deprecated]] attribute diagnostics for …
Browse files Browse the repository at this point in the history
…local variables (llvm#113575)

Fixes llvm#90073
  • Loading branch information
a-tarasyuk authored and NoumanAmir657 committed Nov 4, 2024
1 parent d11e8bc commit 5127354
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,8 @@ Improvements to Clang's diagnostics
name was a reserved name, which we improperly allowed to suppress the
diagnostic.

- Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables (#GH90073).

Improvements to Clang's time-trace
----------------------------------

Expand Down
6 changes: 6 additions & 0 deletions clang/lib/Sema/SemaAvailability.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,12 @@ static bool ShouldDiagnoseAvailabilityInContext(
return false;
}

if (K == AR_Deprecated) {
if (const auto *VD = dyn_cast<VarDecl>(OffendingDecl))
if (VD->isLocalVarDeclOrParm() && VD->isDeprecated())
return true;
}

// Checks if we should emit the availability diagnostic in the context of C.
auto CheckContext = [&](const Decl *C) {
if (K == AR_NotYetIntroduced) {
Expand Down
20 changes: 20 additions & 0 deletions clang/test/SemaCXX/deprecated.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,5 +260,25 @@ namespace ArrayComp {
bool b7 = arr1 == +f();
}

namespace GH90073 {
[[deprecated]] int f1() { // expected-note {{'f1' has been explicitly marked deprecated here}}
[[deprecated]] int a; // expected-note {{'a' has been explicitly marked deprecated here}} \
// expected-note {{'a' has been explicitly marked deprecated here}}
a = 0; // expected-warning {{'a' is deprecated}}
return a; // expected-warning {{'a' is deprecated}}
}

[[deprecated]] void f2([[deprecated]] int x) { // expected-note {{'f2' has been explicitly marked deprecated here}} \
// expected-note {{'x' has been explicitly marked deprecated here}}
x = 4; // expected-warning {{'x' is deprecated}}
}

int main() {
f1(); // expected-warning {{'f1' is deprecated}}
f2(1); // expected-warning {{'f2' is deprecated}}
return 0;
}
}

# 1 "/usr/include/system-header.h" 1 3
void system_header_function(void) throw();

0 comments on commit 5127354

Please sign in to comment.