Magellan Linux

Contents of /trunk/llvm/patches/clang-15.0.7-bitfield-value-capture.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3753 - (show annotations) (download)
Fri Aug 4 08:32:09 2023 UTC (9 months, 1 week ago) by niro
File size: 4175 byte(s)
-llcm/clang patches for 15.0.7
1 From a1a71b7dc97b35133425a31ede90c40529f1be9e Mon Sep 17 00:00:00 2001
2 From: Corentin Jabot <corentinjabot@gmail.com>
3 Date: Thu, 4 Aug 2022 23:02:17 +0200
4 Subject: [PATCH] [Clang] Fix capture of values initialized by bitfields
5
6 This fixes a regression introduced in 127bf44
7
8 Differential Revision: https://reviews.llvm.org/D131202
9 ---
10 .../clang/Basic/DiagnosticSemaKinds.td | 2 --
11 clang/lib/Sema/SemaExpr.cpp | 28 ++-----------------
12 clang/test/SemaCXX/cxx1z-decomposition.cpp | 6 ++--
13 3 files changed, 5 insertions(+), 31 deletions(-)
14
15 diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
16 index 550ad5ab73c642..13209d3bff24ff 100644
17 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
18 +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
19 @@ -9013,8 +9013,6 @@ def ext_ms_anonymous_record : ExtWarn<
20 def err_reference_to_local_in_enclosing_context : Error<
21 "reference to local %select{variable|binding}1 %0 declared in enclosing "
22 "%select{%3|block literal|lambda expression|context}2">;
23 -def err_bitfield_capture_by_ref : Error<
24 - "cannot capture a bit-field by reference">;
25 def err_capture_binding_openmp : Error<
26 "capturing a structured binding is not yet supported in OpenMP">;
27 def ext_capture_binding : ExtWarn<
28 diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
29 index 9497c4b5d53004..152f15159fa1f9 100644
30 --- a/clang/lib/Sema/SemaExpr.cpp
31 +++ b/clang/lib/Sema/SemaExpr.cpp
32 @@ -18533,32 +18533,8 @@ static bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var,
33 } else {
34 ByRef = (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
35 }
36 - // C++20 : [expr.prim.lambda.capture]p12
37 - // A bit-field or a member of an anonymous union shall
38 - // not be captured by reference.
39 - MemberExpr *ME = nullptr;
40 - BindingDecl *BD = nullptr;
41 - if (auto *V = dyn_cast<VarDecl>(Var)) {
42 - if (V->getInit())
43 - ME = dyn_cast<MemberExpr>(V->getInit()->IgnoreImplicit());
44 - } else if ((BD = dyn_cast<BindingDecl>(Var))) {
45 - ME = dyn_cast_or_null<MemberExpr>(BD->getBinding());
46 - }
47 -
48 - // Capturing a bitfield by reference is not allowed except in OpenMP.
49 - if (ByRef && ME &&
50 - (isa<BindingDecl>(Var) || !S.LangOpts.OpenMP ||
51 - !S.isOpenMPCapturedDecl(Var))) {
52 - const auto *FD = dyn_cast_or_null<FieldDecl>(ME->getMemberDecl());
53 - if (FD && FD->isBitField()) {
54 - if (BuildAndDiagnose) {
55 - S.Diag(Loc, diag::err_bitfield_capture_by_ref) << Var;
56 - S.Diag(Var->getLocation(), diag::note_entity_declared_at) << Var;
57 - S.Diag(FD->getLocation(), diag::note_bitfield_decl) << FD;
58 - }
59 - Invalid = true;
60 - }
61 - }
62 +
63 + BindingDecl *BD = dyn_cast<BindingDecl>(Var);
64 // FIXME: We should support capturing structured bindings in OpenMP.
65 if (!Invalid && BD && S.LangOpts.OpenMP) {
66 if (BuildAndDiagnose) {
67 diff --git a/clang/test/SemaCXX/cxx1z-decomposition.cpp b/clang/test/SemaCXX/cxx1z-decomposition.cpp
68 index 7165f30dc07030..13fe826759a347 100644
69 --- a/clang/test/SemaCXX/cxx1z-decomposition.cpp
70 +++ b/clang/test/SemaCXX/cxx1z-decomposition.cpp
71 @@ -84,9 +84,9 @@ void enclosing() {
72
73 (void)[outerbit1]{}; // expected-error {{'outerbit1' cannot be captured because it does not have automatic storage duration}}
74
75 - auto [bit, var] = S2{1, 1}; // expected-note 4{{'bit' declared here}}
76 + auto [bit, var] = S2{1, 1}; // expected-note 2{{'bit' declared here}}
77
78 - (void)[&bit] { // expected-error {{cannot capture a bit-field by reference}} \
79 + (void)[&bit] { // expected-error {{non-const reference cannot bind to bit-field 'a'}} \
80 // expected-warning {{C++20}}
81 return bit;
82 };
83 @@ -96,7 +96,7 @@ void enclosing() {
84 };
85
86 (void)[&] { return bit + u; } // expected-error {{unnamed variable cannot be implicitly captured in a lambda expression}} \
87 - // expected-error {{cannot capture a bit-field by reference}} \
88 + // expected-error {{non-const reference cannot bind to bit-field 'a'}} \
89 // expected-warning {{C++20}}
90 ();
91 }