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:
Aaron Ballman 2024-09-04 12:33:05 -04:00 committed by GitHub
parent c537dd9375
commit 7e03753539
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 25 additions and 8 deletions

View File

@ -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
-----------------------------------

View File

@ -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)

View 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}}

View File

@ -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 *')}}

View File

@ -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));