mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-19 00:56:41 +00:00
Disallow btf_type_tag in C++ mode (#107238)
This was always intended to be disallowed in C++ (see the definition in Attr.td), but failed to add the correct checking code in SemaType.cpp to ensure it was rejected. Fixes #106864
This commit is contained in:
parent
c537dd9375
commit
7e03753539
@ -225,6 +225,11 @@ Attribute Changes in Clang
|
||||
more cases where the returned reference outlives the object.
|
||||
(#GH100567)
|
||||
|
||||
- Clang now correctly diagnoses the use of ``btf_type_tag`` in C++ and ignores
|
||||
it; this attribute is a C-only attribute, and caused crashes with template
|
||||
instantiation by accidentally allowing it in C++ in some circumstances.
|
||||
(#GH106864)
|
||||
|
||||
Improvements to Clang's diagnostics
|
||||
-----------------------------------
|
||||
|
||||
|
@ -6490,6 +6490,15 @@ static void HandleBTFTypeTagAttribute(QualType &Type, const ParsedAttr &Attr,
|
||||
TypeProcessingState &State) {
|
||||
Sema &S = State.getSema();
|
||||
|
||||
// This attribute is only supported in C.
|
||||
// FIXME: we should implement checkCommonAttributeFeatures() in SemaAttr.cpp
|
||||
// such that it handles type attributes, and then call that from
|
||||
// processTypeAttrs() instead of one-off checks like this.
|
||||
if (!Attr.diagnoseLangOpts(S)) {
|
||||
Attr.setInvalid();
|
||||
return;
|
||||
}
|
||||
|
||||
// Check the number of attribute arguments.
|
||||
if (Attr.getNumArgs() != 1) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
|
||||
|
11
clang/test/Sema/attr-btf_type_tag.cpp
Normal file
11
clang/test/Sema/attr-btf_type_tag.cpp
Normal file
@ -0,0 +1,11 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify=c -x c %s
|
||||
|
||||
// c-no-diagnostics
|
||||
|
||||
// Ensure that we diagnose the attribute as ignored in C++ but not in C.
|
||||
#ifdef __cplusplus
|
||||
static_assert(__builtin_is_implicit_lifetime(int __attribute__((btf_type_tag("user"))) *)); // expected-warning {{'btf_type_tag' attribute ignored}}
|
||||
#endif
|
||||
int __attribute__((btf_type_tag("user"))) *ptr; // expected-warning {{'btf_type_tag' attribute ignored}}
|
||||
|
@ -90,13 +90,6 @@ N t19 = 0 ? (__underlying_type(EnumsX::X)){} : (__underlying_type(EnumsY::Y)){};
|
||||
N t20 = 0 ? (__underlying_type(EnumsX::X)){} : (__underlying_type(EnumsY::X)){};
|
||||
// expected-error@-1 {{rvalue of type '__underlying_type(Enums::X)' (aka 'int')}}
|
||||
|
||||
using SBTF1 = SS1 [[clang::btf_type_tag("1")]];
|
||||
using SBTF2 = ::SS1 [[clang::btf_type_tag("1")]];
|
||||
using SBTF3 = ::SS1 [[clang::btf_type_tag("2")]];
|
||||
|
||||
N t21 = 0 ? (SBTF1){} : (SBTF3){}; // expected-error {{from 'SS1'}}
|
||||
N t22 = 0 ? (SBTF1){} : (SBTF2){}; // expected-error {{from 'SS1 __attribute__((btf_type_tag("1")))' (aka 'SS1')}}
|
||||
|
||||
using QX = const SB1 *;
|
||||
using QY = const ::SB1 *;
|
||||
N t23 = 0 ? (QX){} : (QY){}; // expected-error {{rvalue of type 'const SB1 *' (aka 'const SS1 *')}}
|
||||
|
@ -2052,7 +2052,6 @@ void is_implicit_lifetime(int n) {
|
||||
static_assert(__builtin_is_implicit_lifetime(float4));
|
||||
static_assert(__builtin_is_implicit_lifetime(align_value_int));
|
||||
static_assert(__builtin_is_implicit_lifetime(int[[clang::annotate_type("category2")]] *));
|
||||
static_assert(__builtin_is_implicit_lifetime(int __attribute__((btf_type_tag("user"))) *));
|
||||
static_assert(__builtin_is_implicit_lifetime(EnforceReadOnlyPlacement));
|
||||
static_assert(__builtin_is_implicit_lifetime(int __attribute__((noderef)) *));
|
||||
static_assert(__builtin_is_implicit_lifetime(TypeVisibility));
|
||||
|
Loading…
x
Reference in New Issue
Block a user