[libc-commits] [libc] [libc]: Add `-Wglobal-constructors` for libc tests (PR #131485)

Vinay Deshmukh via libc-commits libc-commits at lists.llvm.org
Sun Mar 30 08:09:26 PDT 2025


https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/131485

>From 6dd5a77e6f107b5f83d82405a2f4346498228e73 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sat, 15 Mar 2025 22:01:35 -0400
Subject: [PATCH 01/22] `-Wglobal-constructors`

---
 libc/cmake/modules/LLVMLibCTestRules.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 45a36abd8ce1b..fef670885229c 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -57,7 +57,7 @@ function(_get_common_test_compile_options output_var c_test flags)
       list(APPEND compile_options "-Wnewline-eof")
       list(APPEND compile_options "-Wnonportable-system-include-path")
       list(APPEND compile_options "-Wthread-safety")
-      # list(APPEND compile_options "-Wglobal-constructors")
+      list(APPEND compile_options "-Wglobal-constructors")
     endif()
   endif()
   set(${output_var} ${compile_options} PARENT_SCOPE)

>From a142b5be42a18cc1cd06040af671ac6e92a0b2e6 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sat, 15 Mar 2025 22:09:31 -0400
Subject: [PATCH 02/22] Werror to break pipeline

---
 libc/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index ad39ff6fbcb1e..15cbda1df7ded 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -34,6 +34,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
   add_definitions("-D_DEBUG")
 endif()
 
+add_compile_options("-Werror")
 
 # Default to C++17
 set(CMAKE_CXX_STANDARD 17)

>From 6b558fb81bfc129455e06d408b6adc03a42aa7be Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Mon, 17 Mar 2025 20:41:38 -0400
Subject: [PATCH 03/22] Use static member instances

---
 libc/test/UnitTest/LibcTest.h | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index fbeafd0bacb75..2c53a4127becf 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -350,9 +350,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-  };                                                                           \
-  TypeList::Tests<SuiteName##_##TestName>::type                                \
+    static TypeList::Tests<SuiteName##_##TestName>::type                       \
       SuiteName##_##TestName##_Instance;                                       \
+  };                                                                           \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
 #define TYPED_TEST_F(SuiteClass, TestName, TypeList)                           \
@@ -370,9 +370,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-  };                                                                           \
-  TypeList::Tests<SuiteClass##_##TestName>::type                               \
+    static TypeList::Tests<SuiteClass##_##TestName>::type                      \
       SuiteClass##_##TestName##_Instance;                                      \
+  };                                                                           \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
 #define TEST(SuiteName, TestName)                                              \
@@ -383,8 +383,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     SuiteName##_##TestName() { addTest(this); }                                \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
+    static SuiteName##_##TestName SuiteName##_##TestName##_Instance;           \
   };                                                                           \
-  SuiteName##_##TestName SuiteName##_##TestName##_Instance;                    \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -396,8 +396,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     SuiteClass##_##TestName() { addTest(this); }                               \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
+    static SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;         \
   };                                                                           \
-  SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
   void SuiteClass##_##TestName::Run()
 
 // Helper to trick the compiler into ignoring lack of braces on the else

>From 168dc9dfdd19f3d33f16971d38f365f7ac25cca0 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Wed, 19 Mar 2025 20:20:53 -0400
Subject: [PATCH 04/22] cf

---
 libc/test/UnitTest/LibcTest.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 2c53a4127becf..ed75e230218ca 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -351,7 +351,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
     static TypeList::Tests<SuiteName##_##TestName>::type                       \
-      SuiteName##_##TestName##_Instance;                                       \
+        SuiteName##_##TestName##_Instance;                                     \
   };                                                                           \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
@@ -371,7 +371,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
     static TypeList::Tests<SuiteClass##_##TestName>::type                      \
-      SuiteClass##_##TestName##_Instance;                                      \
+        SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 

>From 70ba2f96202ea8cf43fb6914afcadd4d5f765a19 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Thu, 20 Mar 2025 18:31:53 -0400
Subject: [PATCH 05/22] try to isolate warning

---
 libc/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index 15cbda1df7ded..b86eefc05e782 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -34,7 +34,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
   add_definitions("-D_DEBUG")
 endif()
 
-add_compile_options("-Werror")
+add_compile_options("-Werror=global-constructors")
 
 # Default to C++17
 set(CMAKE_CXX_STANDARD 17)

>From 9bb0c5b4e417700ad5f87cf0173bc1203f054d7a Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 15:16:20 -0400
Subject: [PATCH 06/22] constexpr ctor

---
 libc/test/UnitTest/LibcTest.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index ed75e230218ca..3da119cc070b4 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -343,7 +343,7 @@ CString libc_make_test_file_path_func(const char *file_name);
   public:                                                                      \
     using ParamType = T;                                                       \
     char name[256];                                                            \
-    SuiteName##_##TestName() {                                                 \
+    constexpr SuiteName##_##TestName() {                                       \
       addTest(this);                                                           \
       LIBC_NAMESPACE::testing::internal::GenerateName<T>(                      \
           name, sizeof(name), #SuiteName "." #TestName);                       \
@@ -363,7 +363,7 @@ CString libc_make_test_file_path_func(const char *file_name);
   public:                                                                      \
     using ParamType = T;                                                       \
     char name[256];                                                            \
-    SuiteClass##_##TestName() {                                                \
+    constexpr SuiteClass##_##TestName() {                                      \
       SuiteClass<T>::addTest(this);                                            \
       LIBC_NAMESPACE::testing::internal::GenerateName<T>(                      \
           name, sizeof(name), #SuiteClass "." #TestName);                      \
@@ -380,7 +380,7 @@ CString libc_make_test_file_path_func(const char *file_name);
                 "All LLVM-libc TEST suite names must start with 'LlvmLibc'."); \
   class SuiteName##_##TestName : public LIBC_NAMESPACE::testing::Test {        \
   public:                                                                      \
-    SuiteName##_##TestName() { addTest(this); }                                \
+    constexpr SuiteName##_##TestName() { addTest(this); }                      \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
     static SuiteName##_##TestName SuiteName##_##TestName##_Instance;           \
@@ -393,7 +393,7 @@ CString libc_make_test_file_path_func(const char *file_name);
       "All LLVM-libc TEST_F suite class names must start with 'LlvmLibc'.");   \
   class SuiteClass##_##TestName : public SuiteClass {                          \
   public:                                                                      \
-    SuiteClass##_##TestName() { addTest(this); }                               \
+    constexpr SuiteClass##_##TestName() { addTest(this); }                     \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
     static SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;         \

>From ca587e0b135038f15bc5e16cb33e8878a299fc2c Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 15:58:17 -0400
Subject: [PATCH 07/22] instance is constexpr

---
 libc/test/UnitTest/LibcTest.h | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 3da119cc070b4..5e6149f88b4ba 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -350,7 +350,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-    static TypeList::Tests<SuiteName##_##TestName>::type                       \
+    static constexpr TypeList::Tests<SuiteName##_##TestName>::type             \
         SuiteName##_##TestName##_Instance;                                     \
   };                                                                           \
   template <typename T> void SuiteName##_##TestName<T>::Run()
@@ -370,7 +370,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-    static TypeList::Tests<SuiteClass##_##TestName>::type                      \
+    static constexpr TypeList::Tests<SuiteClass##_##TestName>::type            \
         SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
@@ -383,7 +383,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     constexpr SuiteName##_##TestName() { addTest(this); }                      \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
-    static SuiteName##_##TestName SuiteName##_##TestName##_Instance;           \
+    static constexpr SuiteName##_##TestName SuiteName##_##TestName##_Instance; \
   };                                                                           \
   void SuiteName##_##TestName::Run()
 
@@ -396,7 +396,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     constexpr SuiteClass##_##TestName() { addTest(this); }                     \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
-    static SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;         \
+    static constexpr SuiteClass##_##TestName                                   \
+        SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
   void SuiteClass##_##TestName::Run()
 

>From 82a84bb1d485089827fbe4378b9ce526145c00c2 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 16:09:51 -0400
Subject: [PATCH 08/22] default constexpr for Test

---
 libc/test/UnitTest/LibcTest.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 5e6149f88b4ba..5d5555b611a47 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -120,6 +120,7 @@ class Test {
   static int getNumTests();
 
 public:
+  constexpr Test() = default;
   virtual ~Test() {}
   virtual void SetUp() {}
   virtual void TearDown() {}

>From 05733f7a628c6e2549bd7618a7759d5ad62a7ee6 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 16:17:42 -0400
Subject: [PATCH 09/22] outside

---
 libc/test/UnitTest/LibcTest.h | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 5d5555b611a47..2dc9306bad46e 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -351,9 +351,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-    static constexpr TypeList::Tests<SuiteName##_##TestName>::type             \
-        SuiteName##_##TestName##_Instance;                                     \
   };                                                                           \
+  constexpr TypeList::Tests<SuiteName##_##TestName>::type                      \
+      SuiteName##_##TestName##_Instance;                                       \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
 #define TYPED_TEST_F(SuiteClass, TestName, TypeList)                           \
@@ -371,9 +371,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-    static constexpr TypeList::Tests<SuiteClass##_##TestName>::type            \
-        SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
+  static constexpr TypeList::Tests<SuiteClass##_##TestName>::type              \
+      SuiteClass##_##TestName##_Instance;                                      \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
 #define TEST(SuiteName, TestName)                                              \
@@ -384,8 +384,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     constexpr SuiteName##_##TestName() { addTest(this); }                      \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
-    static constexpr SuiteName##_##TestName SuiteName##_##TestName##_Instance; \
   };                                                                           \
+  static constexpr SuiteName##_##TestName SuiteName##_##TestName##_Instance;   \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -397,9 +397,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     constexpr SuiteClass##_##TestName() { addTest(this); }                     \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
-    static constexpr SuiteClass##_##TestName                                   \
-        SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
+  static constexpr SuiteClass##_##TestName SuiteClass##_##TestName##_Instance; \
   void SuiteClass##_##TestName::Run()
 
 // Helper to trick the compiler into ignoring lack of braces on the else

>From 928e5c16e88f3acd857961ddfbed564eefaf36c1 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 16:27:46 -0400
Subject: [PATCH 10/22] remove virtual dtor

---
 libc/test/UnitTest/LibcTest.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 2dc9306bad46e..e5cfc05e4e368 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -121,7 +121,6 @@ class Test {
 
 public:
   constexpr Test() = default;
-  virtual ~Test() {}
   virtual void SetUp() {}
   virtual void TearDown() {}
 

>From 0ab296549a59d8aac3c4ef6326924959d65cef01 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 16:39:39 -0400
Subject: [PATCH 11/22] note: non-constexpr function addTest cannot be used in
 a constant expression

---
 libc/test/UnitTest/LibcTest.cpp | 11 -----------
 libc/test/UnitTest/LibcTest.h   | 13 ++++++++++++-
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.cpp b/libc/test/UnitTest/LibcTest.cpp
index fec45982f3e63..e1033240d3550 100644
--- a/libc/test/UnitTest/LibcTest.cpp
+++ b/libc/test/UnitTest/LibcTest.cpp
@@ -116,17 +116,6 @@ char **envp = nullptr;
 
 using internal::RunContext;
 
-void Test::addTest(Test *T) {
-  if (End == nullptr) {
-    Start = T;
-    End = T;
-    return;
-  }
-
-  End->Next = T;
-  End = T;
-}
-
 int Test::getNumTests() {
   int N = 0;
   for (Test *T = Start; T; T = T->Next, ++N)
diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index e5cfc05e4e368..49937bf84114d 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -127,7 +127,18 @@ class Test {
   static int runTests(const TestOptions &Options);
 
 protected:
-  static void addTest(Test *T);
+  constexpr static void *addTest(Test *T) {
+    if (End == nullptr) {
+      Start = T;
+      End = T;
+      // read  of constexpr
+      return nullptr;
+    }
+
+    End->Next = T;
+    End = T;
+    return nullptr;
+  }
 
   // We make use of a template function, with |LHS| and |RHS| as explicit
   // parameters, for enhanced type checking. Other gtest like unittest

>From ec4be668567ce300ef857c2e96bfba94777b6663 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 16:59:07 -0400
Subject: [PATCH 12/22] restore to original

---
 libc/test/UnitTest/LibcTest.cpp | 11 +++++++++++
 libc/test/UnitTest/LibcTest.h   | 31 ++++++++++---------------------
 2 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.cpp b/libc/test/UnitTest/LibcTest.cpp
index e1033240d3550..fec45982f3e63 100644
--- a/libc/test/UnitTest/LibcTest.cpp
+++ b/libc/test/UnitTest/LibcTest.cpp
@@ -116,6 +116,17 @@ char **envp = nullptr;
 
 using internal::RunContext;
 
+void Test::addTest(Test *T) {
+  if (End == nullptr) {
+    Start = T;
+    End = T;
+    return;
+  }
+
+  End->Next = T;
+  End = T;
+}
+
 int Test::getNumTests() {
   int N = 0;
   for (Test *T = Start; T; T = T->Next, ++N)
diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 49937bf84114d..fbeafd0bacb75 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -120,25 +120,14 @@ class Test {
   static int getNumTests();
 
 public:
-  constexpr Test() = default;
+  virtual ~Test() {}
   virtual void SetUp() {}
   virtual void TearDown() {}
 
   static int runTests(const TestOptions &Options);
 
 protected:
-  constexpr static void *addTest(Test *T) {
-    if (End == nullptr) {
-      Start = T;
-      End = T;
-      // read  of constexpr
-      return nullptr;
-    }
-
-    End->Next = T;
-    End = T;
-    return nullptr;
-  }
+  static void addTest(Test *T);
 
   // We make use of a template function, with |LHS| and |RHS| as explicit
   // parameters, for enhanced type checking. Other gtest like unittest
@@ -354,7 +343,7 @@ CString libc_make_test_file_path_func(const char *file_name);
   public:                                                                      \
     using ParamType = T;                                                       \
     char name[256];                                                            \
-    constexpr SuiteName##_##TestName() {                                       \
+    SuiteName##_##TestName() {                                                 \
       addTest(this);                                                           \
       LIBC_NAMESPACE::testing::internal::GenerateName<T>(                      \
           name, sizeof(name), #SuiteName "." #TestName);                       \
@@ -362,7 +351,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
   };                                                                           \
-  constexpr TypeList::Tests<SuiteName##_##TestName>::type                      \
+  TypeList::Tests<SuiteName##_##TestName>::type                                \
       SuiteName##_##TestName##_Instance;                                       \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
@@ -374,7 +363,7 @@ CString libc_make_test_file_path_func(const char *file_name);
   public:                                                                      \
     using ParamType = T;                                                       \
     char name[256];                                                            \
-    constexpr SuiteClass##_##TestName() {                                      \
+    SuiteClass##_##TestName() {                                                \
       SuiteClass<T>::addTest(this);                                            \
       LIBC_NAMESPACE::testing::internal::GenerateName<T>(                      \
           name, sizeof(name), #SuiteClass "." #TestName);                      \
@@ -382,7 +371,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
   };                                                                           \
-  static constexpr TypeList::Tests<SuiteClass##_##TestName>::type              \
+  TypeList::Tests<SuiteClass##_##TestName>::type                               \
       SuiteClass##_##TestName##_Instance;                                      \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
@@ -391,11 +380,11 @@ CString libc_make_test_file_path_func(const char *file_name);
                 "All LLVM-libc TEST suite names must start with 'LlvmLibc'."); \
   class SuiteName##_##TestName : public LIBC_NAMESPACE::testing::Test {        \
   public:                                                                      \
-    constexpr SuiteName##_##TestName() { addTest(this); }                      \
+    SuiteName##_##TestName() { addTest(this); }                                \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
   };                                                                           \
-  static constexpr SuiteName##_##TestName SuiteName##_##TestName##_Instance;   \
+  SuiteName##_##TestName SuiteName##_##TestName##_Instance;                    \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -404,11 +393,11 @@ CString libc_make_test_file_path_func(const char *file_name);
       "All LLVM-libc TEST_F suite class names must start with 'LlvmLibc'.");   \
   class SuiteClass##_##TestName : public SuiteClass {                          \
   public:                                                                      \
-    constexpr SuiteClass##_##TestName() { addTest(this); }                     \
+    SuiteClass##_##TestName() { addTest(this); }                               \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
   };                                                                           \
-  static constexpr SuiteClass##_##TestName SuiteClass##_##TestName##_Instance; \
+  SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
   void SuiteClass##_##TestName::Run()
 
 // Helper to trick the compiler into ignoring lack of braces on the else

>From 620bf4a5fd2045f3d39e72c387fb36104a8d5434 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 17:04:36 -0400
Subject: [PATCH 13/22] pragma wrap

---
 libc/test/UnitTest/LibcTest.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index fbeafd0bacb75..6f3357730697a 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,6 +334,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wglobal-constructors"
+
 #define TYPED_TEST(SuiteName, TestName, TypeList)                              \
   static_assert(                                                               \
       LIBC_NAMESPACE::testing::internal::valid_prefix(#SuiteName),             \
@@ -400,6 +403,8 @@ CString libc_make_test_file_path_func(const char *file_name);
   SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
   void SuiteClass##_##TestName::Run()
 
+#pragma GCC diagnostic pop
+
 // Helper to trick the compiler into ignoring lack of braces on the else
 // branch.  We cannot introduce braces at this point, since it would prevent
 // using `<< ...` after the test macro for additional failure output.

>From e8be0531188144630cb2230d7f5091da328d7344 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 23 Mar 2025 17:14:19 -0400
Subject: [PATCH 14/22] pragma wrap

---
 libc/test/UnitTest/LibcTest.h | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 6f3357730697a..e62f5313eda44 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,8 +334,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wglobal-constructors"
+#define DO_PRAGMA_BEGIN #pragma GCC diagnostic push
+
+#define DO_PRAGMA #pragma GCC diagnostic ignored "-Wglobal-constructors"
+
+#define DO_PRAGMA_END #pragma GCC diagnostic pop
 
 #define TYPED_TEST(SuiteName, TestName, TypeList)                              \
   static_assert(                                                               \
@@ -354,8 +357,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA                                                                    \
   TypeList::Tests<SuiteName##_##TestName>::type                                \
       SuiteName##_##TestName##_Instance;                                       \
+  DO_PRAGMA_END                                                                \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
 #define TYPED_TEST_F(SuiteClass, TestName, TypeList)                           \
@@ -374,8 +380,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA                                                                    \
   TypeList::Tests<SuiteClass##_##TestName>::type                               \
       SuiteClass##_##TestName##_Instance;                                      \
+  DO_PRAGMA_END                                                                \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
 #define TEST(SuiteName, TestName)                                              \
@@ -387,7 +396,10 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA                                                                    \
   SuiteName##_##TestName SuiteName##_##TestName##_Instance;                    \
+  DO_PRAGMA_END                                                                \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -400,11 +412,12 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA                                                                    \
   SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
+  DO_PRAGMA_END                                                                \
   void SuiteClass##_##TestName::Run()
 
-#pragma GCC diagnostic pop
-
 // Helper to trick the compiler into ignoring lack of braces on the else
 // branch.  We cannot introduce braces at this point, since it would prevent
 // using `<< ...` after the test macro for additional failure output.

>From 889c3ba2b9dd54b97b8bf37f6151fcd06251e596 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Mon, 24 Mar 2025 19:21:41 -0400
Subject: [PATCH 15/22] undo pragma

---
 libc/CMakeLists.txt           | 2 +-
 libc/test/UnitTest/LibcTest.h | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index b86eefc05e782..b2a5b3ae246a3 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -34,7 +34,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
   add_definitions("-D_DEBUG")
 endif()
 
-add_compile_options("-Werror=global-constructors")
+# add_compile_options("-Werror=global-constructors")
 
 # Default to C++17
 set(CMAKE_CXX_STANDARD 17)
diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index e62f5313eda44..6299d43f52d0b 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,11 +334,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
-#define DO_PRAGMA_BEGIN #pragma GCC diagnostic push
+#define DO_PRAGMA_BEGIN 
 
-#define DO_PRAGMA #pragma GCC diagnostic ignored "-Wglobal-constructors"
+#define DO_PRAGMA 
 
-#define DO_PRAGMA_END #pragma GCC diagnostic pop
+#define DO_PRAGMA_END 
 
 #define TYPED_TEST(SuiteName, TestName, TypeList)                              \
   static_assert(                                                               \

>From 94a783bd797913834b2af8fb9b6dee46ba0b913d Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 09:21:15 -0400
Subject: [PATCH 16/22] remove pragma attempt

---
 libc/test/UnitTest/LibcTest.h | 30 ++++++------------------------
 1 file changed, 6 insertions(+), 24 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index 6299d43f52d0b..ed75e230218ca 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,12 +334,6 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
-#define DO_PRAGMA_BEGIN 
-
-#define DO_PRAGMA 
-
-#define DO_PRAGMA_END 
-
 #define TYPED_TEST(SuiteName, TestName, TypeList)                              \
   static_assert(                                                               \
       LIBC_NAMESPACE::testing::internal::valid_prefix(#SuiteName),             \
@@ -356,12 +350,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
+    static TypeList::Tests<SuiteName##_##TestName>::type                       \
+        SuiteName##_##TestName##_Instance;                                     \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA                                                                    \
-  TypeList::Tests<SuiteName##_##TestName>::type                                \
-      SuiteName##_##TestName##_Instance;                                       \
-  DO_PRAGMA_END                                                                \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
 #define TYPED_TEST_F(SuiteClass, TestName, TypeList)                           \
@@ -379,12 +370,9 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
+    static TypeList::Tests<SuiteClass##_##TestName>::type                      \
+        SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA                                                                    \
-  TypeList::Tests<SuiteClass##_##TestName>::type                               \
-      SuiteClass##_##TestName##_Instance;                                      \
-  DO_PRAGMA_END                                                                \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
 #define TEST(SuiteName, TestName)                                              \
@@ -395,11 +383,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     SuiteName##_##TestName() { addTest(this); }                                \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
+    static SuiteName##_##TestName SuiteName##_##TestName##_Instance;           \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA                                                                    \
-  SuiteName##_##TestName SuiteName##_##TestName##_Instance;                    \
-  DO_PRAGMA_END                                                                \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -411,11 +396,8 @@ CString libc_make_test_file_path_func(const char *file_name);
     SuiteClass##_##TestName() { addTest(this); }                               \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
+    static SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;         \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA                                                                    \
-  SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
-  DO_PRAGMA_END                                                                \
   void SuiteClass##_##TestName::Run()
 
 // Helper to trick the compiler into ignoring lack of braces on the else

>From f20b84d74b0dfd13b49a3ddd84076349f1916b6f Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 09:48:55 -0400
Subject: [PATCH 17/22] Fix cmake failure

---
 libc/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index b2a5b3ae246a3..b86eefc05e782 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -34,7 +34,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
   add_definitions("-D_DEBUG")
 endif()
 
-# add_compile_options("-Werror=global-constructors")
+add_compile_options("-Werror=global-constructors")
 
 # Default to C++17
 set(CMAKE_CXX_STANDARD 17)

>From fbb0ca5473835f18e6ac3ead2a14a81298d59127 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 09:49:12 -0400
Subject: [PATCH 18/22] Use _Pragma correctly

---
 libc/test/UnitTest/LibcTest.h | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index ed75e230218ca..f2d71c0e32647 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,6 +334,15 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
+
+#define DO_PRAGMA(x) _Pragma (#x);
+
+#define DO_PRAGMA_BEGIN DO_PRAGMA(GCC diagnostic push)
+
+#define DO_PRAGMA_BODY DO_PRAGMA(GCC diagnostic ignored "-Wglobal-constructors")
+
+#define DO_PRAGMA_END DO_PRAGMA(GCC diagnostic pop)
+
 #define TYPED_TEST(SuiteName, TestName, TypeList)                              \
   static_assert(                                                               \
       LIBC_NAMESPACE::testing::internal::valid_prefix(#SuiteName),             \
@@ -350,9 +359,12 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-    static TypeList::Tests<SuiteName##_##TestName>::type                       \
-        SuiteName##_##TestName##_Instance;                                     \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA_BODY                                                                    \
+  TypeList::Tests<SuiteName##_##TestName>::type                                \
+      SuiteName##_##TestName##_Instance;                                       \
+  DO_PRAGMA_END                                                                \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
 #define TYPED_TEST_F(SuiteClass, TestName, TypeList)                           \
@@ -370,9 +382,12 @@ CString libc_make_test_file_path_func(const char *file_name);
     }                                                                          \
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
-    static TypeList::Tests<SuiteClass##_##TestName>::type                      \
-        SuiteClass##_##TestName##_Instance;                                    \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA_BODY                                                                    \
+  TypeList::Tests<SuiteClass##_##TestName>::type                               \
+      SuiteClass##_##TestName##_Instance;                                      \
+  DO_PRAGMA_END                                                                \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
 #define TEST(SuiteName, TestName)                                              \
@@ -383,8 +398,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     SuiteName##_##TestName() { addTest(this); }                                \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
-    static SuiteName##_##TestName SuiteName##_##TestName##_Instance;           \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA_BODY                                                                    \
+  SuiteName##_##TestName SuiteName##_##TestName##_Instance;                    \
+  DO_PRAGMA_END                                                                \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -396,8 +414,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     SuiteClass##_##TestName() { addTest(this); }                               \
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
-    static SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;         \
   };                                                                           \
+  DO_PRAGMA_BEGIN                                                              \
+  DO_PRAGMA_BODY                                                                    \
+  SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
+  DO_PRAGMA_END                                                                \
   void SuiteClass##_##TestName::Run()
 
 // Helper to trick the compiler into ignoring lack of braces on the else

>From 009b11b923b98148aa5748b26cb0f9485e2c5be1 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 09:56:27 -0400
Subject: [PATCH 19/22] collisions

---
 libc/test/UnitTest/LibcTest.h | 37 +++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index f2d71c0e32647..d3f8357267002 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,14 +334,17 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
+#define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(x) _Pragma(#x);
 
-#define DO_PRAGMA(x) _Pragma (#x);
+#define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BEGIN                                  \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(GCC diagnostic push)
 
-#define DO_PRAGMA_BEGIN DO_PRAGMA(GCC diagnostic push)
+#define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BODY                                   \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(GCC diagnostic ignored                       \
+                                  "-Wglobal-constructors")
 
-#define DO_PRAGMA_BODY DO_PRAGMA(GCC diagnostic ignored "-Wglobal-constructors")
-
-#define DO_PRAGMA_END DO_PRAGMA(GCC diagnostic pop)
+#define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_END                                    \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(GCC diagnostic pop)
 
 #define TYPED_TEST(SuiteName, TestName, TypeList)                              \
   static_assert(                                                               \
@@ -360,11 +363,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA_BODY                                                                    \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BEGIN                                        \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BODY                                         \
   TypeList::Tests<SuiteName##_##TestName>::type                                \
       SuiteName##_##TestName##_Instance;                                       \
-  DO_PRAGMA_END                                                                \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_END                                          \
   template <typename T> void SuiteName##_##TestName<T>::Run()
 
 #define TYPED_TEST_F(SuiteClass, TestName, TypeList)                           \
@@ -383,11 +386,11 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return name; }                      \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA_BODY                                                                    \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BEGIN                                        \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BODY                                         \
   TypeList::Tests<SuiteClass##_##TestName>::type                               \
       SuiteClass##_##TestName##_Instance;                                      \
-  DO_PRAGMA_END                                                                \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_END                                          \
   template <typename T> void SuiteClass##_##TestName<T>::Run()
 
 #define TEST(SuiteName, TestName)                                              \
@@ -399,10 +402,10 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteName "." #TestName; }  \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA_BODY                                                                    \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BEGIN                                        \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BODY                                         \
   SuiteName##_##TestName SuiteName##_##TestName##_Instance;                    \
-  DO_PRAGMA_END                                                                \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_END                                          \
   void SuiteName##_##TestName::Run()
 
 #define TEST_F(SuiteClass, TestName)                                           \
@@ -415,10 +418,10 @@ CString libc_make_test_file_path_func(const char *file_name);
     void Run() override;                                                       \
     const char *getName() const override { return #SuiteClass "." #TestName; } \
   };                                                                           \
-  DO_PRAGMA_BEGIN                                                              \
-  DO_PRAGMA_BODY                                                                    \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BEGIN                                        \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BODY                                         \
   SuiteClass##_##TestName SuiteClass##_##TestName##_Instance;                  \
-  DO_PRAGMA_END                                                                \
+  LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_END                                          \
   void SuiteClass##_##TestName::Run()
 
 // Helper to trick the compiler into ignoring lack of braces on the else

>From 54b604a00089131dfd2b97b24f534e3c5ed7bb30 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 10:33:19 -0400
Subject: [PATCH 20/22] warning: extra ';' outside of a function is
 incompatible with C++98 [-Wc++98-compat-extra-semi]

---
 libc/test/UnitTest/LibcTest.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/test/UnitTest/LibcTest.h b/libc/test/UnitTest/LibcTest.h
index d3f8357267002..54221de4da454 100644
--- a/libc/test/UnitTest/LibcTest.h
+++ b/libc/test/UnitTest/LibcTest.h
@@ -334,7 +334,7 @@ CString libc_make_test_file_path_func(const char *file_name);
     return "[ParamType = " #TYPE "]";                                          \
   }
 
-#define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(x) _Pragma(#x);
+#define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(x) _Pragma(#x)
 
 #define LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA_BEGIN                                  \
   LIBC_TEST_GLOBAL_CTOR_DO_PRAGMA(GCC diagnostic push)

>From ccf13f36962e89e19f0bb0a501e7e068e1dd2e74 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 10:52:28 -0400
Subject: [PATCH 21/22] Assume it's an intentional global

---
 libc/test/integration/startup/gpu/init_fini_array_test.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/libc/test/integration/startup/gpu/init_fini_array_test.cpp b/libc/test/integration/startup/gpu/init_fini_array_test.cpp
index ceedd5fc81358..52005ba627062 100644
--- a/libc/test/integration/startup/gpu/init_fini_array_test.cpp
+++ b/libc/test/integration/startup/gpu/init_fini_array_test.cpp
@@ -32,7 +32,10 @@ int GLOBAL_INDEX = 512;
 int INITVAL_INITIALIZER = 0x600D;
 int BEFORE_INITIALIZER = 0xFEED;
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wglobal-constructors"
 A global(GLOBAL_INDEX, INITVAL_INITIALIZER);
+#pragma GCC diagnostic pop
 
 int initval = 0;
 int before = 0;

>From 9b0cff4c28099536f47ac8a2efb740f28b958535 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 30 Mar 2025 11:08:53 -0400
Subject: [PATCH 22/22] another one

---
 libc/test/integration/startup/linux/init_fini_array_test.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/libc/test/integration/startup/linux/init_fini_array_test.cpp b/libc/test/integration/startup/linux/init_fini_array_test.cpp
index ed14e03a60c05..d2ee48c3428ff 100644
--- a/libc/test/integration/startup/linux/init_fini_array_test.cpp
+++ b/libc/test/integration/startup/linux/init_fini_array_test.cpp
@@ -31,7 +31,10 @@ class A {
 int GLOBAL_INDEX = 512;
 int INITVAL_INITIALIZER = 0x600D;
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wglobal-constructors"
 A global(GLOBAL_INDEX, INITVAL_INITIALIZER);
+#pragma GCC diagnostic pop
 
 int initval = 0;
 int preinitval = 0;



More information about the libc-commits mailing list