Skip to content

Commit 1c3bb96

Browse files
committed
Merge remote-tracking branch 'upstream/release/20.x' into rustc/20.1-2025-02-13
2 parents 92e8068 + a69568e commit 1c3bb96

File tree

211 files changed

+11272
-3407
lines changed

Some content is hidden

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

211 files changed

+11272
-3407
lines changed

.github/workflows/release-binaries.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ jobs:
138138
arches=arm64
139139
else
140140
arches=x86_64
141+
# Disable Flang builds on macOS x86_64. The FortranLower library takes
142+
# 2-3 hours to build on macOS, much slower than on Linux.
143+
# The long build time causes the release build to time out on x86_64,
144+
# so we need to disable flang there.
145+
target_cmake_flags="$target_cmake_flags -DLLVM_RELEASE_ENABLE_PROJECTS='clang;lld;lldb;clang-tools-extra;polly;mlir'"
141146
fi
142147
target_cmake_flags="$target_cmake_flags -DBOOTSTRAP_DARWIN_osx_ARCHS=$arches -DBOOTSTRAP_DARWIN_osx_BUILTIN_ARCHS=$arches"
143148
fi

clang/cmake/caches/Release.cmake

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,21 @@ endfunction()
2929
# cache file to CMake via -C. e.g.
3030
#
3131
# cmake -D LLVM_RELEASE_ENABLE_PGO=ON -C Release.cmake
32+
33+
set (DEFAULT_PROJECTS "clang;lld;lldb;clang-tools-extra;polly;mlir;flang")
34+
# bolt only supports ELF, so only enable it for Linux.
35+
if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
36+
list(APPEND DEFAULT_PROJECTS "bolt")
37+
endif()
38+
3239
set (DEFAULT_RUNTIMES "compiler-rt;libcxx")
3340
if (NOT WIN32)
3441
list(APPEND DEFAULT_RUNTIMES "libcxxabi" "libunwind")
3542
endif()
3643
set(LLVM_RELEASE_ENABLE_LTO THIN CACHE STRING "")
3744
set(LLVM_RELEASE_ENABLE_PGO ON CACHE BOOL "")
3845
set(LLVM_RELEASE_ENABLE_RUNTIMES ${DEFAULT_RUNTIMES} CACHE STRING "")
39-
set(LLVM_RELEASE_ENABLE_PROJECTS "clang;lld;lldb;clang-tools-extra;bolt;polly;mlir;flang" CACHE STRING "")
46+
set(LLVM_RELEASE_ENABLE_PROJECTS ${DEFAULT_PROJECTS} CACHE STRING "")
4047
# Note we don't need to add install here, since it is one of the pre-defined
4148
# steps.
4249
set(LLVM_RELEASE_FINAL_STAGE_TARGETS "clang;package;check-all;check-llvm;check-clang" CACHE STRING "")
@@ -48,10 +55,8 @@ set(CLANG_ENABLE_BOOTSTRAP ON CACHE BOOL "")
4855

4956
set(STAGE1_PROJECTS "clang")
5057

51-
# Building Flang on Windows requires compiler-rt, so we need to build it in
52-
# stage1. compiler-rt is also required for building the Flang tests on
53-
# macOS.
54-
set(STAGE1_RUNTIMES "compiler-rt")
58+
# Build all runtimes so we can statically link them into the stage2 compiler.
59+
set(STAGE1_RUNTIMES "compiler-rt;libcxx;libcxxabi;libunwind")
5560

5661
if (LLVM_RELEASE_ENABLE_PGO)
5762
list(APPEND STAGE1_PROJECTS "lld")
@@ -90,9 +95,20 @@ else()
9095
set(CLANG_BOOTSTRAP_TARGETS ${LLVM_RELEASE_FINAL_STAGE_TARGETS} CACHE STRING "")
9196
endif()
9297

98+
if (LLVM_RELEASE_ENABLE_LTO)
99+
# Enable LTO for the runtimes. We need to configure stage1 clang to default
100+
# to using lld as the linker because the stage1 toolchain will be used to
101+
# build and link the runtimes.
102+
# FIXME: We can't use LLVM_ENABLE_LTO=Thin here, because it causes the CMake
103+
# step for the libcxx build to fail. CMAKE_INTERPROCEDURAL_OPTIMIZATION does
104+
# enable ThinLTO, though.
105+
set(RUNTIMES_CMAKE_ARGS "-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DLLVM_ENABLE_LLD=ON" CACHE STRING "")
106+
endif()
107+
93108
# Stage 1 Common Config
94109
set(LLVM_ENABLE_RUNTIMES ${STAGE1_RUNTIMES} CACHE STRING "")
95110
set(LLVM_ENABLE_PROJECTS ${STAGE1_PROJECTS} CACHE STRING "")
111+
set(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY ON CACHE STRING "")
96112

97113
# stage2-instrumented and Final Stage Config:
98114
# Options that need to be set in both the instrumented stage (if we are doing
@@ -102,13 +118,29 @@ set_instrument_and_final_stage_var(LLVM_ENABLE_LTO "${LLVM_RELEASE_ENABLE_LTO}"
102118
if (LLVM_RELEASE_ENABLE_LTO)
103119
set_instrument_and_final_stage_var(LLVM_ENABLE_LLD "ON" BOOL)
104120
endif()
121+
set_instrument_and_final_stage_var(LLVM_ENABLE_LIBCXX "ON" BOOL)
122+
set_instrument_and_final_stage_var(LLVM_STATIC_LINK_CXX_STDLIB "ON" BOOL)
123+
set(RELEASE_LINKER_FLAGS "-rtlib=compiler-rt --unwindlib=libunwind")
124+
if(NOT ${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin")
125+
set(RELEASE_LINKER_FLAGS "${RELEASE_LINKER_FLAGS} -static-libgcc")
126+
endif()
127+
128+
# Set flags for bolt
129+
if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
130+
set(RELEASE_LINKER_FLAGS "${RELEASE_LINKER_FLAGS} -Wl,--emit-relocs,-znow")
131+
endif()
132+
133+
set_instrument_and_final_stage_var(CMAKE_EXE_LINKER_FLAGS ${RELEASE_LINKER_FLAGS} STRING)
134+
set_instrument_and_final_stage_var(CMAKE_SHARED_LINKER_FLAGS ${RELEASE_LINKER_FLAGS} STRING)
135+
set_instrument_and_final_stage_var(CMAKE_MODULE_LINKER_FLAGS ${RELEASE_LINKER_FLAGS} STRING)
105136

106137
# Final Stage Config (stage2)
107138
set_final_stage_var(LLVM_ENABLE_RUNTIMES "${LLVM_RELEASE_ENABLE_RUNTIMES}" STRING)
108139
set_final_stage_var(LLVM_ENABLE_PROJECTS "${LLVM_RELEASE_ENABLE_PROJECTS}" STRING)
140+
if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
141+
set_final_stage_var(CLANG_BOLT "INSTRUMENT" STRING)
142+
endif()
109143
set_final_stage_var(CPACK_GENERATOR "TXZ" STRING)
110144
set_final_stage_var(CPACK_ARCHIVE_THREADS "0" STRING)
111145

112-
if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin")
113-
set_final_stage_var(LLVM_USE_STATIC_ZSTD "ON" BOOL)
114-
endif()
146+
set_final_stage_var(LLVM_USE_STATIC_ZSTD "ON" BOOL)

clang/docs/ReleaseNotes.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,8 @@ Bug Fixes in This Version
897897
- No longer return ``false`` for ``noexcept`` expressions involving a
898898
``delete`` which resolves to a destroying delete but the type of the object
899899
being deleted has a potentially throwing destructor (#GH118660).
900+
- Clang now outputs correct values when #embed data contains bytes with negative
901+
signed char values (#GH102798).
900902

901903
Bug Fixes to Compiler Builtins
902904
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -1053,6 +1055,9 @@ Bug Fixes to C++ Support
10531055
template parameter. Now, such expression can be used with ``static_assert`` and ``constexpr``. (#GH123498)
10541056
- Correctly determine the implicit constexprness of lambdas in dependent contexts. (#GH97958) (#GH114234)
10551057
- Fix that some dependent immediate expressions did not cause immediate escalation (#GH119046)
1058+
- Fixed a substitution bug in transforming CTAD aliases when the type alias contains a non-pack template argument
1059+
corresponding to a pack parameter (#GH124715)
1060+
- Clang is now better at keeping track of friend function template instance contexts. (#GH55509)
10561061

10571062
Bug Fixes to AST Handling
10581063
^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -1264,6 +1269,8 @@ CUDA Support
12641269

12651270
AIX Support
12661271
^^^^^^^^^^^
1272+
- Fixed the ``-print-runtime-dir`` option.
1273+
- Enable continuous profile syncing feature on AIX.
12671274

12681275
NetBSD Support
12691276
^^^^^^^^^^^^^^

clang/docs/UsersManual.rst

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2489,6 +2489,82 @@ are listed below.
24892489
24902490
$ clang -fuse-ld=lld -Oz -Wl,--icf=safe -fcodegen-data-use code.cc
24912491
2492+
.. _strict_aliasing:
2493+
2494+
Strict Aliasing
2495+
---------------
2496+
2497+
The C and C++ standards require accesses to objects in memory to use l-values of
2498+
an appropriate type for the object. This is called *strict aliasing* or
2499+
*type-based alias analysis*. Strict aliasing enhances a variety of powerful
2500+
memory optimizations, including reordering, combining, and eliminating memory
2501+
accesses. These optimizations can lead to unexpected behavior in code that
2502+
violates the strict aliasing rules. For example:
2503+
2504+
.. code-block:: c++
2505+
2506+
void advance(size_t *index, double *data) {
2507+
double value = data[*index];
2508+
/* Clang may assume that this store does not change the contents of `data`. */
2509+
*index += 1;
2510+
/* Clang may assume that this store does not change the contents of `index`. */
2511+
data[*index] = value;
2512+
/* Either of these facts may create significant optimization opportunities
2513+
if Clang is able to inline this function. */
2514+
}
2515+
2516+
Strict aliasing can be explicitly enabled with ``-fstrict-aliasing`` and
2517+
disabled with ``-fno-strict-aliasing``. ``clang-cl`` defaults to
2518+
``-fno-strict-aliasing``; see . Otherwise, Clang defaults to ``-fstrict-aliasing``.
2519+
2520+
C and C++ specify slightly different rules for strict aliasing. To improve
2521+
language interoperability, Clang allows two types to alias if either language
2522+
would permit it. This includes applying the C++ similar types rule to C,
2523+
allowing ``int **`` to alias ``int const * const *``. Clang also relaxes the
2524+
standard aliasing rules in the following ways:
2525+
2526+
* All integer types of the same size are permitted to alias each other,
2527+
including signed and unsigned types.
2528+
* ``void*`` is permitted to alias any pointer type, ``void**`` is permitted to
2529+
alias any pointer to pointer type, and so on.
2530+
2531+
Code which violates strict aliasing has undefined behavior. A program that
2532+
works in one version of Clang may not work in another because of changes to the
2533+
optimizer. Clang provides a :doc:`TypeSanitizer` to help detect
2534+
violations of the strict aliasing rules, but it is currently still experimental.
2535+
Code that is known to violate strict aliasing should generally be built with
2536+
``-fno-strict-aliasing`` if the violation cannot be fixed.
2537+
2538+
Clang supports several ways to fix a violation of strict aliasing:
2539+
2540+
* L-values of the character types ``char`` and ``unsigned char`` (as well as
2541+
other types, depending on the standard) are permitted to access objects of
2542+
any type.
2543+
2544+
* Library functions such as ``memcpy`` and ``memset`` are specified as treating
2545+
memory as characters and therefore are not limited by strict aliasing. If a
2546+
value of one type must be reinterpreted as another (e.g. to read the bits of a
2547+
floating-point number), use ``memcpy`` to copy the representation to an object
2548+
of the destination type. This has no overhead over a direct l-value access
2549+
because Clang should reliably optimize calls to these functions to use simple
2550+
loads and stores when they are used with small constant sizes.
2551+
2552+
* The attribute ``may_alias`` can be added to a ``typedef`` to give l-values of
2553+
that type the same aliasing power as the character types.
2554+
2555+
Clang makes a best effort to avoid obvious miscompilations from strict aliasing
2556+
by only considering type information when it cannot prove that two accesses must
2557+
refer to the same memory. However, it is not recommended that programmers
2558+
intentionally rely on this instead of using one of the solutions above because
2559+
it is too easy for the compiler's analysis to be blocked in surprising ways.
2560+
2561+
In Clang 20, Clang strengthened its implementation of strict aliasing for
2562+
accesses of pointer type. Previously, all accesses of pointer type were
2563+
permitted to alias each other, but Clang now distinguishes different pointers
2564+
by their pointee type, except as limited by the relaxations around qualifiers
2565+
and ``void*`` described above. The previous behavior of treating all pointers as
2566+
aliasing can be restored using ``-fno-pointer-tbaa``.
2567+
24922568
Profile Guided Optimization
24932569
---------------------------
24942570

@@ -5272,12 +5348,6 @@ The Visual C++ Toolset has a slightly more elaborate mechanism for detection.
52725348
Restrictions and Limitations compared to Clang
52735349
----------------------------------------------
52745350

5275-
Strict Aliasing
5276-
^^^^^^^^^^^^^^^
5277-
5278-
Strict aliasing (TBAA) is always off by default in clang-cl. Whereas in clang,
5279-
strict aliasing is turned on by default for all optimization levels.
5280-
5281-
To enable LLVM optimizations based on strict aliasing rules (e.g., optimizations
5282-
based on type of expressions in C/C++), user will need to explicitly pass
5283-
`-fstrict-aliasing` to clang-cl.
5351+
Strict aliasing (TBAA) is always off by default in clang-cl whereas in clang,
5352+
strict aliasing is turned on by default for all optimization levels. For more
5353+
details, see :ref:`Strict aliasing <strict_aliasing>`.

clang/include/clang/AST/Decl.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2298,6 +2298,13 @@ class FunctionDecl : public DeclaratorDecl,
22982298
FunctionDeclBits.IsLateTemplateParsed = ILT;
22992299
}
23002300

2301+
bool isInstantiatedFromMemberTemplate() const {
2302+
return FunctionDeclBits.IsInstantiatedFromMemberTemplate;
2303+
}
2304+
void setInstantiatedFromMemberTemplate(bool Val = true) {
2305+
FunctionDeclBits.IsInstantiatedFromMemberTemplate = Val;
2306+
}
2307+
23012308
/// Whether this function is "trivial" in some specialized C++ senses.
23022309
/// Can only be true for default constructors, copy constructors,
23032310
/// copy assignment operators, and destructors. Not meaningful until

clang/include/clang/AST/DeclBase.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,6 +1780,8 @@ class DeclContext {
17801780
uint64_t HasImplicitReturnZero : 1;
17811781
LLVM_PREFERRED_TYPE(bool)
17821782
uint64_t IsLateTemplateParsed : 1;
1783+
LLVM_PREFERRED_TYPE(bool)
1784+
uint64_t IsInstantiatedFromMemberTemplate : 1;
17831785

17841786
/// Kind of contexpr specifier as defined by ConstexprSpecKind.
17851787
LLVM_PREFERRED_TYPE(ConstexprSpecKind)
@@ -1830,7 +1832,7 @@ class DeclContext {
18301832
};
18311833

18321834
/// Number of inherited and non-inherited bits in FunctionDeclBitfields.
1833-
enum { NumFunctionDeclBits = NumDeclContextBits + 31 };
1835+
enum { NumFunctionDeclBits = NumDeclContextBits + 32 };
18341836

18351837
/// Stores the bits used by CXXConstructorDecl. If modified
18361838
/// NumCXXConstructorDeclBits and the accessor
@@ -1841,12 +1843,12 @@ class DeclContext {
18411843
LLVM_PREFERRED_TYPE(FunctionDeclBitfields)
18421844
uint64_t : NumFunctionDeclBits;
18431845

1844-
/// 20 bits to fit in the remaining available space.
1846+
/// 19 bits to fit in the remaining available space.
18451847
/// Note that this makes CXXConstructorDeclBitfields take
18461848
/// exactly 64 bits and thus the width of NumCtorInitializers
18471849
/// will need to be shrunk if some bit is added to NumDeclContextBitfields,
18481850
/// NumFunctionDeclBitfields or CXXConstructorDeclBitfields.
1849-
uint64_t NumCtorInitializers : 17;
1851+
uint64_t NumCtorInitializers : 16;
18501852
LLVM_PREFERRED_TYPE(bool)
18511853
uint64_t IsInheritingConstructor : 1;
18521854

@@ -1860,7 +1862,7 @@ class DeclContext {
18601862
};
18611863

18621864
/// Number of inherited and non-inherited bits in CXXConstructorDeclBitfields.
1863-
enum { NumCXXConstructorDeclBits = NumFunctionDeclBits + 20 };
1865+
enum { NumCXXConstructorDeclBits = NumFunctionDeclBits + 19 };
18641866

18651867
/// Stores the bits used by ObjCMethodDecl.
18661868
/// If modified NumObjCMethodDeclBits and the accessor

clang/include/clang/AST/DeclTemplate.h

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,26 @@ class FunctionTemplateDecl : public RedeclarableTemplateDecl {
10111011
return getTemplatedDecl()->isThisDeclarationADefinition();
10121012
}
10131013

1014+
bool isCompatibleWithDefinition() const {
1015+
return getTemplatedDecl()->isInstantiatedFromMemberTemplate() ||
1016+
isThisDeclarationADefinition();
1017+
}
1018+
1019+
// This bit closely tracks 'RedeclarableTemplateDecl::InstantiatedFromMember',
1020+
// except this is per declaration, while the redeclarable field is
1021+
// per chain. This indicates a template redeclaration which
1022+
// is compatible with the definition, in the non-trivial case
1023+
// where this is not already a definition.
1024+
// This is only really needed for instantiating the definition of friend
1025+
// function templates, which can have redeclarations in different template
1026+
// contexts.
1027+
// The bit is actually stored in the FunctionDecl for space efficiency
1028+
// reasons.
1029+
void setInstantiatedFromMemberTemplate(FunctionTemplateDecl *D) {
1030+
getTemplatedDecl()->setInstantiatedFromMemberTemplate();
1031+
RedeclarableTemplateDecl::setInstantiatedFromMemberTemplate(D);
1032+
}
1033+
10141034
/// Return the specialization with the provided arguments if it exists,
10151035
/// otherwise return the insertion point.
10161036
FunctionDecl *findSpecialization(ArrayRef<TemplateArgument> Args,
@@ -1841,15 +1861,23 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
18411861
LLVM_PREFERRED_TYPE(TemplateSpecializationKind)
18421862
unsigned SpecializationKind : 3;
18431863

1864+
/// Indicate that we have matched a parameter pack with a non pack
1865+
/// argument, when the opposite match is also allowed (strict pack match).
1866+
/// This needs to be cached as deduction is performed during declaration,
1867+
/// and we need the information to be preserved so that it is consistent
1868+
/// during instantiation.
1869+
bool MatchedPackOnParmToNonPackOnArg : 1;
1870+
18441871
protected:
18451872
ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
18461873
DeclContext *DC, SourceLocation StartLoc,
18471874
SourceLocation IdLoc,
18481875
ClassTemplateDecl *SpecializedTemplate,
18491876
ArrayRef<TemplateArgument> Args,
1877+
bool MatchedPackOnParmToNonPackOnArg,
18501878
ClassTemplateSpecializationDecl *PrevDecl);
18511879

1852-
explicit ClassTemplateSpecializationDecl(ASTContext &C, Kind DK);
1880+
ClassTemplateSpecializationDecl(ASTContext &C, Kind DK);
18531881

18541882
public:
18551883
friend class ASTDeclReader;
@@ -1859,7 +1887,7 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
18591887
Create(ASTContext &Context, TagKind TK, DeclContext *DC,
18601888
SourceLocation StartLoc, SourceLocation IdLoc,
18611889
ClassTemplateDecl *SpecializedTemplate,
1862-
ArrayRef<TemplateArgument> Args,
1890+
ArrayRef<TemplateArgument> Args, bool MatchedPackOnParmToNonPackOnArg,
18631891
ClassTemplateSpecializationDecl *PrevDecl);
18641892
static ClassTemplateSpecializationDecl *CreateDeserialized(ASTContext &C,
18651893
GlobalDeclID ID);
@@ -1930,6 +1958,10 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
19301958
SpecializationKind = TSK;
19311959
}
19321960

1961+
bool hasMatchedPackOnParmToNonPackOnArg() const {
1962+
return MatchedPackOnParmToNonPackOnArg;
1963+
}
1964+
19331965
/// Get the point of instantiation (if any), or null if none.
19341966
SourceLocation getPointOfInstantiation() const {
19351967
return PointOfInstantiation;

clang/include/clang/Basic/BuiltinsNVPTX.td

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ class SM<string version, list<SMFeatures> newer_list> : SMFeatures {
2121
!strconcat(f, "|", newer.Features));
2222
}
2323

24+
let Features = "sm_120a" in def SM_120a : SMFeatures;
25+
let Features = "sm_101a" in def SM_101a : SMFeatures;
2426
let Features = "sm_100a" in def SM_100a : SMFeatures;
25-
26-
def SM_100 : SM<"100", [SM_100a]>;
27-
2827
let Features = "sm_90a" in def SM_90a : SMFeatures;
2928

29+
def SM_120 : SM<"120", [SM_120a]>;
30+
def SM_101 : SM<"101", [SM_101a, SM_120]>;
31+
def SM_100 : SM<"100", [SM_100a, SM_101]>;
3032
def SM_90 : SM<"90", [SM_90a, SM_100]>;
3133
def SM_89 : SM<"89", [SM_90]>;
3234
def SM_87 : SM<"87", [SM_89]>;

clang/include/clang/Basic/Cuda.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ enum class OffloadArch {
8282
SM_90a,
8383
SM_100,
8484
SM_100a,
85+
SM_101,
86+
SM_101a,
87+
SM_120,
88+
SM_120a,
8589
GFX600,
8690
GFX601,
8791
GFX602,

clang/include/clang/Sema/Sema.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13491,8 +13491,8 @@ class Sema final : public SemaBase {
1349113491
bool InstantiateClassTemplateSpecialization(
1349213492
SourceLocation PointOfInstantiation,
1349313493
ClassTemplateSpecializationDecl *ClassTemplateSpec,
13494-
TemplateSpecializationKind TSK, bool Complain = true,
13495-
bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false);
13494+
TemplateSpecializationKind TSK, bool Complain,
13495+
bool PrimaryHasMatchedPackOnParmToNonPackOnArg);
1349613496

1349713497
/// Instantiates the definitions of all of the member
1349813498
/// of the given class, which is an instantiation of a class template

0 commit comments

Comments
 (0)