Skip to content

Commit 11905d9

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:a001e9718fd974859f2797a9f9ed7bf87d364e4f into amd-gfx:29bb79adc602
Local branch amd-gfx 29bb79a Merged main:e0c554ad87d18dcbfcb9b6485d0da800ae1338d1 into amd-gfx:6b757b334e67 Remote branch main a001e97 [SimplifyLibCalls] Dont try to manually reprocess calls
2 parents 29bb79a + a001e97 commit 11905d9

File tree

128 files changed

+5974
-1524
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

128 files changed

+5974
-1524
lines changed

clang-tools-extra/include-cleaner/tool/IncludeCleaner.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
#include "clang/Tooling/Tooling.h"
1717
#include "llvm/ADT/STLFunctionalExtras.h"
1818
#include "llvm/ADT/SmallVector.h"
19+
#include "llvm/ADT/StringMap.h"
1920
#include "llvm/ADT/StringRef.h"
2021
#include "llvm/Support/CommandLine.h"
2122
#include "llvm/Support/FormatVariadic.h"
22-
#include "llvm/Support/MemoryBuffer.h"
2323
#include "llvm/Support/Regex.h"
2424
#include "llvm/Support/Signals.h"
2525
#include "llvm/Support/raw_ostream.h"
@@ -110,14 +110,16 @@ format::FormatStyle getStyle(llvm::StringRef Filename) {
110110

111111
class Action : public clang::ASTFrontendAction {
112112
public:
113-
Action(llvm::function_ref<bool(llvm::StringRef)> HeaderFilter)
114-
: HeaderFilter(HeaderFilter){};
113+
Action(llvm::function_ref<bool(llvm::StringRef)> HeaderFilter,
114+
llvm::StringMap<std::string> &EditedFiles)
115+
: HeaderFilter(HeaderFilter), EditedFiles(EditedFiles) {}
115116

116117
private:
117118
RecordedAST AST;
118119
RecordedPP PP;
119120
PragmaIncludes PI;
120121
llvm::function_ref<bool(llvm::StringRef)> HeaderFilter;
122+
llvm::StringMap<std::string> &EditedFiles;
121123

122124
bool BeginInvocation(CompilerInstance &CI) override {
123125
// We only perform include-cleaner analysis. So we disable diagnostics that
@@ -181,17 +183,8 @@ class Action : public clang::ASTFrontendAction {
181183
}
182184
}
183185

184-
if (Edit && (!Results.Missing.empty() || !Results.Unused.empty())) {
185-
if (auto Err = llvm::writeToOutput(
186-
Path, [&](llvm::raw_ostream &OS) -> llvm::Error {
187-
OS << Final;
188-
return llvm::Error::success();
189-
})) {
190-
llvm::errs() << "Failed to apply edits to " << Path << ": "
191-
<< toString(std::move(Err)) << "\n";
192-
++Errors;
193-
}
194-
}
186+
if (!Results.Missing.empty() || !Results.Unused.empty())
187+
EditedFiles.try_emplace(Path, Final);
195188
}
196189

197190
void writeHTML() {
@@ -215,11 +208,17 @@ class ActionFactory : public tooling::FrontendActionFactory {
215208
: HeaderFilter(HeaderFilter) {}
216209

217210
std::unique_ptr<clang::FrontendAction> create() override {
218-
return std::make_unique<Action>(HeaderFilter);
211+
return std::make_unique<Action>(HeaderFilter, EditedFiles);
212+
}
213+
214+
const llvm::StringMap<std::string> &editedFiles() const {
215+
return EditedFiles;
219216
}
220217

221218
private:
222219
llvm::function_ref<bool(llvm::StringRef)> HeaderFilter;
220+
// Map from file name to final code with the include edits applied.
221+
llvm::StringMap<std::string> EditedFiles;
223222
};
224223

225224
std::function<bool(llvm::StringRef)> headerFilter() {
@@ -274,21 +273,26 @@ int main(int argc, const char **argv) {
274273

275274
clang::tooling::ClangTool Tool(OptionsParser->getCompilations(),
276275
OptionsParser->getSourcePathList());
277-
std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;
278-
for (const auto &File : OptionsParser->getSourcePathList()) {
279-
auto Content = llvm::MemoryBuffer::getFile(File);
280-
if (!Content) {
281-
llvm::errs() << "Error: can't read file '" << File
282-
<< "': " << Content.getError().message() << "\n";
283-
return 1;
284-
}
285-
Buffers.push_back(std::move(Content.get()));
286-
Tool.mapVirtualFile(File, Buffers.back()->getBuffer());
287-
}
288276

289277
auto HeaderFilter = headerFilter();
290278
if (!HeaderFilter)
291279
return 1; // error already reported.
292280
ActionFactory Factory(HeaderFilter);
293-
return Tool.run(&Factory) || Errors != 0;
281+
auto ErrorCode = Tool.run(&Factory);
282+
if (Edit) {
283+
for (const auto &NameAndContent : Factory.editedFiles()) {
284+
llvm::StringRef FileName = NameAndContent.first();
285+
const std::string &FinalCode = NameAndContent.second;
286+
if (auto Err = llvm::writeToOutput(
287+
FileName, [&](llvm::raw_ostream &OS) -> llvm::Error {
288+
OS << FinalCode;
289+
return llvm::Error::success();
290+
})) {
291+
llvm::errs() << "Failed to apply edits to " << FileName << ": "
292+
<< toString(std::move(Err)) << "\n";
293+
++Errors;
294+
}
295+
}
296+
}
297+
return ErrorCode || Errors != 0;
294298
}

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ Attribute Changes in Clang
357357
- Clang now introduced ``[[clang::coro_lifetimebound]]`` attribute.
358358
All parameters of a function are considered to be lifetime bound if the function
359359
returns a type annotated with ``[[clang::coro_lifetimebound]]`` and ``[[clang::coro_return_type]]``.
360+
This analysis can be disabled for a function by annotating the function with ``[[clang::coro_disable_lifetimebound]]``.
360361

361362
Improvements to Clang's diagnostics
362363
-----------------------------------

clang/include/clang/Basic/Attr.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,14 @@ def CoroLifetimeBound : InheritableAttr {
11211121
let SimpleHandler = 1;
11221122
}
11231123

1124+
def CoroDisableLifetimeBound : InheritableAttr {
1125+
let Spellings = [Clang<"coro_disable_lifetimebound">];
1126+
let Subjects = SubjectList<[Function]>;
1127+
let LangOpts = [CPlusPlus];
1128+
let Documentation = [CoroLifetimeBoundDoc];
1129+
let SimpleHandler = 1;
1130+
}
1131+
11241132
// OSObject-based attributes.
11251133
def OSConsumed : InheritableParamAttr {
11261134
let Spellings = [Clang<"os_consumed">];

clang/include/clang/Basic/AttrDocs.td

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7671,9 +7671,12 @@ The ``[[clang::coro_lifetimebound]]`` is a class attribute which can be applied
76717671
to a coroutine return type (`CRT`_) (i.e.
76727672
it should also be annotated with ``[[clang::coro_return_type]]``).
76737673

7674-
All parameters of a function are considered to be lifetime bound. See `documentation`_
7675-
of ``[[clang::lifetimebound]]`` for more details.
7676-
if the function returns a coroutine return type (CRT) annotated with ``[[clang::coro_lifetimebound]]``.
7674+
All parameters of a function are considered to be lifetime bound if the function returns a
7675+
coroutine return type (CRT) annotated with ``[[clang::coro_lifetimebound]]``.
7676+
This lifetime bound analysis can be disabled for a coroutine wrapper or a coroutine by annotating the function
7677+
with ``[[clang::coro_disable_lifetimebound]]`` function attribute .
7678+
See `documentation`_ of ``[[clang::lifetimebound]]`` for details about lifetime bound analysis.
7679+
76777680

76787681
Reference parameters of a coroutine are susceptible to capturing references to temporaries or local variables.
76797682

@@ -7703,7 +7706,7 @@ Both coroutines and coroutine wrappers are part of this analysis.
77037706
};
77047707

77057708
Task<int> coro(const int& a) { co_return a + 1; }
7706-
Task<int> [[clang::coro_wrapper]] coro_wrapper(const int& a, const int& b) {
7709+
[[clang::coro_wrapper]] Task<int> coro_wrapper(const int& a, const int& b) {
77077710
return a > b ? coro(a) : coro(b);
77087711
}
77097712
Task<int> temporary_reference() {
@@ -7718,6 +7721,21 @@ Both coroutines and coroutine wrappers are part of this analysis.
77187721
return coro(a); // warning: returning address of stack variable `a`.
77197722
}
77207723

7724+
This analysis can be disabled for all calls to a particular function by annotating the function
7725+
with function attribute ``[[clang::coro_disable_lifetimebound]]``.
7726+
For example, this could be useful for coroutine wrappers which accept reference parameters
7727+
but do not pass them to the underlying coroutine or pass them by value.
7728+
7729+
.. code-block:: c++
7730+
7731+
Task<int> coro(int a) { co_return a + 1; }
7732+
[[clang::coro_wrapper, clang::coro_disable_lifetimebound]] Task<int> coro_wrapper(const int& a) {
7733+
return coro(a + 1);
7734+
}
7735+
void use() {
7736+
auto task = coro_wrapper(1); // use of temporary is fine as the argument is not lifetime bound.
7737+
}
7738+
77217739
.. _`documentation`: https://clang.llvm.org/docs/AttributeReference.html#lifetimebound
77227740
.. _`CRT`: https://clang.llvm.org/docs/AttributeReference.html#coro-return-type
77237741
}];

clang/lib/Sema/SemaInit.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7581,7 +7581,8 @@ static void visitLifetimeBoundArguments(IndirectLocalPath &Path, Expr *Call,
75817581
bool CheckCoroCall = false;
75827582
if (const auto *RD = Callee->getReturnType()->getAsRecordDecl()) {
75837583
CheckCoroCall = RD->hasAttr<CoroLifetimeBoundAttr>() &&
7584-
RD->hasAttr<CoroReturnTypeAttr>();
7584+
RD->hasAttr<CoroReturnTypeAttr>() &&
7585+
!Callee->hasAttr<CoroDisableLifetimeBoundAttr>();
75857586
}
75867587
for (unsigned I = 0,
75877588
N = std::min<unsigned>(Callee->getNumParams(), Args.size());

clang/test/Misc/pragma-attribute-supported-attributes-list.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
// CHECK-NEXT: ConsumableAutoCast (SubjectMatchRule_record)
5858
// CHECK-NEXT: ConsumableSetOnRead (SubjectMatchRule_record)
5959
// CHECK-NEXT: Convergent (SubjectMatchRule_function)
60+
// CHECK-NEXT: CoroDisableLifetimeBound (SubjectMatchRule_function)
6061
// CHECK-NEXT: CoroLifetimeBound (SubjectMatchRule_record)
6162
// CHECK-NEXT: CoroOnlyDestroyWhenComplete (SubjectMatchRule_record)
6263
// CHECK-NEXT: CoroReturnType (SubjectMatchRule_record)

clang/test/SemaCXX/coro-lifetimebound.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,18 @@ CoNoCRT<int> bar(int a) {
115115
co_return 1;
116116
}
117117
} // namespace not_a_crt
118+
119+
// =============================================================================
120+
// Not lifetime bound coroutine wrappers: [[clang::coro_disable_lifetimebound]].
121+
// =============================================================================
122+
namespace disable_lifetimebound {
123+
Co<int> foo(int x) { co_return x; }
124+
125+
[[clang::coro_wrapper, clang::coro_disable_lifetimebound]]
126+
Co<int> foo_wrapper(const int& x) { return foo(x); }
127+
128+
[[clang::coro_wrapper]] Co<int> caller() {
129+
// The call to foo_wrapper is wrapper is safe.
130+
return foo_wrapper(1);
131+
}
132+
} // namespace disable_lifetimebound

flang/test/Lower/array-temp.f90

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ subroutine ss4(N)
4343

4444
! CHECK-LABEL: func @_QPss2(
4545
! CHECK-SAME: %arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {
46-
! CHECK: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
47-
! CHECK: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
48-
! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
49-
! CHECK: %[[C_27_i32:[-0-9a-z_]+]] = arith.constant 27 : i32
50-
! CHECK: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
51-
! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
52-
! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
53-
! CHECK: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
54-
! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
46+
! CHECK-DAG: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
47+
! CHECK-DAG: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
48+
! CHECK-DAG: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
49+
! CHECK-DAG: %[[C_27_i32:[-0-9a-z_]+]] = arith.constant 27 : i32
50+
! CHECK-DAG: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
51+
! CHECK-DAG: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
52+
! CHECK-DAG: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
53+
! CHECK-DAG: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
54+
! CHECK-DAG: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
5555
! CHECK: %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
5656
! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[V_0:[0-9]+]] : (i32) -> index
5757
! CHECK: %[[V_2:[0-9]+]] = arith.cmpi sgt, %[[V_1]], %[[C_0]] : index
@@ -137,15 +137,15 @@ subroutine ss4(N)
137137

138138
! CHECK-LABEL: func @_QPss3(
139139
! CHECK-SAME: %arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {
140-
! CHECK: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
141-
! CHECK: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
142-
! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
143-
! CHECK: %[[C_34_i32:[-0-9a-z_]+]] = arith.constant 34 : i32
144-
! CHECK: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
145-
! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
146-
! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
147-
! CHECK: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
148-
! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
140+
! CHECK-DAG: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
141+
! CHECK-DAG: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
142+
! CHECK-DAG: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
143+
! CHECK-DAG: %[[C_34_i32:[-0-9a-z_]+]] = arith.constant 34 : i32
144+
! CHECK-DAG: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
145+
! CHECK-DAG: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
146+
! CHECK-DAG: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
147+
! CHECK-DAG: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
148+
! CHECK-DAG: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
149149
! CHECK: %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
150150
! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[V_0:[0-9]+]] : (i32) -> index
151151
! CHECK: %[[V_2:[0-9]+]] = arith.cmpi sgt, %[[V_1]], %[[C_0]] : index
@@ -263,15 +263,15 @@ subroutine ss4(N)
263263

264264
! CHECK-LABEL: func @_QPss4(
265265
! CHECK-SAME: %arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {
266-
! CHECK: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
267-
! CHECK: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
268-
! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
269-
! CHECK: %[[C_41_i32:[-0-9a-z_]+]] = arith.constant 41 : i32
270-
! CHECK: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
271-
! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
272-
! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
273-
! CHECK: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
274-
! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
266+
! CHECK-DAG: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
267+
! CHECK-DAG: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
268+
! CHECK-DAG: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
269+
! CHECK-DAG: %[[C_41_i32:[-0-9a-z_]+]] = arith.constant 41 : i32
270+
! CHECK-DAG: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
271+
! CHECK-DAG: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
272+
! CHECK-DAG: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
273+
! CHECK-DAG: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
274+
! CHECK-DAG: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
275275
! CHECK: %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
276276
! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[V_0:[0-9]+]] : (i32) -> index
277277
! CHECK: %[[V_2:[0-9]+]] = arith.cmpi sgt, %[[V_1]], %[[C_0]] : index

libcxx/docs/FeatureTestMacroTable.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ Status
418418
--------------------------------------------------- -----------------
419419
``__cpp_lib_freestanding_variant`` *unimplemented*
420420
--------------------------------------------------- -----------------
421-
``__cpp_lib_fstream_native_handle`` *unimplemented*
421+
``__cpp_lib_fstream_native_handle`` ``202306L``
422422
--------------------------------------------------- -----------------
423423
``__cpp_lib_function_ref`` *unimplemented*
424424
--------------------------------------------------- -----------------
@@ -436,6 +436,8 @@ Status
436436
--------------------------------------------------- -----------------
437437
``__cpp_lib_smart_ptr_owner_equality`` *unimplemented*
438438
--------------------------------------------------- -----------------
439+
``__cpp_lib_span_at`` ``202311L``
440+
--------------------------------------------------- -----------------
439441
``__cpp_lib_span_initializer_list`` *unimplemented*
440442
--------------------------------------------------- -----------------
441443
``__cpp_lib_sstream_from_string_view`` *unimplemented*

libcxx/docs/ReleaseNotes/18.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ Implemented Papers
5757
- P2871R3 - Remove Deprecated Unicode Conversion Facets from C++26
5858
- P2870R3 - Remove basic_string::reserve()
5959
- P2909R4 - Fix formatting of code units as integers (Dude, where’s my ``char``?)
60+
- P2821R5 - span.at()
6061
- P0521R0 - Proposed Resolution for CA 14 (shared_ptr use_count/unique)
62+
- P1759R6 - Native handles and file streams
6163

6264

6365
Improvements and New Features

libcxx/docs/Status/Cxx2cPapers.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"`P2757R3 <https://wg21.link/P2757R3>`__","LWG","Type-checking format args","Varna June 2023","","","|format|"
2020
"`P2637R3 <https://wg21.link/P2637R3>`__","LWG","Member ``visit``","Varna June 2023","","","|format|"
2121
"`P2641R4 <https://wg21.link/P2641R4>`__","CWG, LWG","Checking if a ``union`` alternative is active","Varna June 2023","","",""
22-
"`P1759R6 <https://wg21.link/P1759R6>`__","LWG","Native handles and file streams","Varna June 2023","","",""
22+
"`P1759R6 <https://wg21.link/P1759R6>`__","LWG","Native handles and file streams","Varna June 2023","|Complete|","18.0",""
2323
"`P2697R1 <https://wg21.link/P2697R1>`__","LWG","Interfacing ``bitset`` with ``string_view``","Varna June 2023","|Complete|","18.0",""
2424
"`P1383R2 <https://wg21.link/P1383R2>`__","LWG","More ``constexpr`` for ``<cmath>`` and ``<complex>``","Varna June 2023","","",""
2525
"`P2734R0 <https://wg21.link/P2734R0>`__","LWG","Adding the new SI prefixes","Varna June 2023","|Complete|","17.0",""
@@ -35,7 +35,7 @@
3535
"`P2909R4 <https://wg21.link/P2909R4>`__","LWG","Fix formatting of code units as integers (Dude, where’s my ``char``?)","Kona November 2023","|Complete|","18.0","|format| |DR|"
3636
"`P0952R2 <https://wg21.link/P0952R2>`__","LWG","A new specification for ``std::generate_canonical``","Kona November 2023","","",""
3737
"`P2447R6 <https://wg21.link/P2447R6>`__","LWG","``std::span`` over an initializer list","Kona November 2023","","",""
38-
"`P2821R5 <https://wg21.link/P2821R5>`__","LWG","``span.at()``","Kona November 2023","","",""
38+
"`P2821R5 <https://wg21.link/P2821R5>`__","LWG","``span.at()``","Kona November 2023","|Complete|","18.0",""
3939
"`P2868R3 <https://wg21.link/P2868R3>`__","LWG","Remove Deprecated ``std::allocator`` Typedef From C++26","Kona November 2023","","",""
4040
"`P2870R3 <https://wg21.link/P2870R3>`__","LWG","Remove ``basic_string::reserve()`` From C++26","Kona November 2023","|Complete|","18.0",""
4141
"`P2871R3 <https://wg21.link/P2871R3>`__","LWG","Remove Deprecated Unicode Conversion Facets from C++26","Kona November 2023","|Complete|","18.0",""

0 commit comments

Comments
 (0)