[clang] [clang] Check `std::initializer_list` more strictly (PR #133822)

Timm Baeder via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 31 20:28:54 PDT 2025


================
@@ -12071,6 +12071,37 @@ NamespaceDecl *Sema::getOrCreateStdNamespace() {
   return getStdNamespace();
 }
 
+/// Check that the template-head of this class template is acceptable for
+/// a declaration of 'std::initializer_list', and optionally diagnose if
+/// it is not.
+/// \returns true if any issues were found.
+static bool CheckStdInitializerList(Sema &S, ClassTemplateDecl *Template,
+                                    bool Diagnose) {
+  TemplateParameterList *Params = Template->getTemplateParameters();
+  int ErrorKind = -1;
+
+  if (Params->size() != 1)
+    ErrorKind = 0; // must have exactly one template parameter
+  else if (Template->hasAssociatedConstraints())
+    ErrorKind = 1; // cannot have associated constraints
+  else {
+    auto *Param = dyn_cast<TemplateTypeParmDecl>(Params->getParam(0));
+    if (!Param)
+      ErrorKind = 2; // must have a type template parameter
+    else if (Param->hasDefaultArgument())
+      ErrorKind = 3; // cannot have default template arguments
+    else if (Param->isTemplateParameterPack())
+      ErrorKind = 4; // cannot be a variadic template
----------------
tbaederr wrote:

Please start all the comments with an uppercase latter and end them with a period.

https://github.com/llvm/llvm-project/pull/133822


More information about the cfe-commits mailing list