llvm-project/clang/test/Sema/attr-decl-after-definition-std.c
Aaron Ballman ece10a64cb
Allow some attributes on declarations after definitions (#135791)
The deprecated, maybe_unused, and nodiscard standard attributes may all
be applied to a redeclaration after a definition has already appeared.
We were previously dropping the attribute in that case, now we retain
the attribute after the redeclaration.

Note: someday we may want to tablegen this as part of information from
Attr.td. We may also want to relax the restriction here so that the
syntax used does not matter. This is an intentionally conservative fix.

Fixes #135481
2025-04-15 12:21:04 -04:00

42 lines
1.4 KiB
C

// RUN: %clang_cc1 -fsyntax-only -Wignored-attributes -verify -std=c23 %s
// RUN: %clang_cc1 -fsyntax-only -Wignored-attributes -verify -x c++ %s
// RUN: %clang_cc1 -fsyntax-only -ast-dump %s | FileCheck %s
inline int frob(int x) { return x; }
[[deprecated]] int frob(int); // expected-note 2 {{'frob' has been explicitly marked deprecated here}}
void use1() {
// Using this should give a deprecation warning, but not a nodiscard warning.
frob(0); // expected-warning {{'frob' is deprecated}}
}
[[nodiscard]] int frob(int);
void use2() {
// This should give both warnings.
frob(0); // expected-warning {{'frob' is deprecated}} \
expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
}
[[maybe_unused]] int frob(int);
// Currently, this is only allowed for the standard spelling of the attributes.
void blob() {} // expected-note {{previous definition is here}}
__attribute__((deprecated)) void blob(); // expected-warning {{attribute declaration must precede definition}}
// CHECK: FunctionDecl {{.*}} frob
// CHECK: FunctionDecl {{.*}} prev {{.*}} frob
// CHECK: DeprecatedAttr
// CHECK: FunctionDecl {{.*}} prev {{.*}} frob
// CHECK: DeprecatedAttr
// CHECK: WarnUnusedResultAttr
// CHECK: FunctionDecl {{.*}} prev {{.*}} frob
// CHECK: DeprecatedAttr
// CHECK: WarnUnusedResultAttr
// CHECK: UnusedAttr