From 7073b7cd6e04be5e442795e55b5e7e32de700666 Mon Sep 17 00:00:00 2001
From: Michael Tautschnig <tautschn@amazon.com>
Date: Fri, 17 Nov 2023 17:09:41 +0000
Subject: [PATCH] Make -Wno-maybe-uninitialized the default with GCC

With our use of optionalt/std::optional, these warnings pop up in an
unpredictable manner. See
https://gcc.gnu.org/bugzilla/buglist.cgi?quicksearch=std%3A%3Aoptional
for a number of bug reports against GCC about this.
---
 CMakeLists.txt                    |  4 +++-
 src/config.inc                    |  3 ++-
 src/goto-instrument/unwindset.cpp | 18 ------------------
 src/util/cmdline.cpp              |  6 ------
 src/util/lower_byte_operators.cpp |  7 -------
 src/util/simplify_expr_int.cpp    |  7 -------
 6 files changed, 5 insertions(+), 40 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 436257c44a44..80be9fad89ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,7 +79,9 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
     set(CMAKE_CXX_FLAGS_RELEASE "-O2")
     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
     #   Enable lots of warnings
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror -Wno-deprecated-declarations -Wswitch-enum")
+    set(CMAKE_CXX_FLAGS
+        "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror -Wswitch-enum"
+        " -Wno-deprecated-declarations -Wno-maybe-uninitialized")
 elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
     # This would be the place to enable warnings for Windows builds, although
     # config.inc doesn't seem to do that currently
diff --git a/src/config.inc b/src/config.inc
index d83f625abdf4..ce14bbd8d6c4 100644
--- a/src/config.inc
+++ b/src/config.inc
@@ -5,7 +5,8 @@ BUILD_ENV = AUTO
 ifeq ($(BUILD_ENV),MSVC)
   #CXXFLAGS += /Wall /WX
 else
-  CXXFLAGS += -Wall -pedantic -Werror -Wno-deprecated-declarations -Wswitch-enum
+  CXXFLAGS += -Wall -pedantic -Werror -Wswitch-enum
+  CXXFLAGS += -Wno-deprecated-declarations -Wno-maybe-uninitialized
 endif
 
 ifeq ($(CPROVER_WITH_PROFILING),1)
diff --git a/src/goto-instrument/unwindset.cpp b/src/goto-instrument/unwindset.cpp
index 0905945c8e43..d15822489cb4 100644
--- a/src/goto-instrument/unwindset.cpp
+++ b/src/goto-instrument/unwindset.cpp
@@ -33,13 +33,7 @@ void unwindsett::parse_unwindset_one_loop(
   if(val.empty())
     return;
 
-// Work around spurious GCC 12 warning about thread_nr being uninitialised.
-#pragma GCC diagnostic push
-#ifndef __clang__
-#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
   optionalt<unsigned> thread_nr;
-#pragma GCC diagnostic pop
   if(isdigit(val[0]))
   {
     auto c_pos = val.find(':');
@@ -160,13 +154,7 @@ void unwindsett::parse_unwindset_one_loop(
           return;
         }
         else
-// Work around spurious GCC 12 warning about thread_nr being uninitialised.
-#pragma GCC diagnostic push
-#ifndef __clang__
-#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
           id = function_id + "." + std::to_string(*nr);
-#pragma GCC diagnostic pop
       }
     }
 
@@ -182,13 +170,7 @@ void unwindsett::parse_unwindset_one_loop(
 
     if(thread_nr.has_value())
     {
-// Work around spurious GCC 12 warning about thread_nr being uninitialised.
-#pragma GCC diagnostic push
-#ifndef __clang__
-#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
       thread_loop_map[std::pair<irep_idt, unsigned>(id, *thread_nr)] = uw;
-#pragma GCC diagnostic pop
     }
     else
     {
diff --git a/src/util/cmdline.cpp b/src/util/cmdline.cpp
index fe9ee544680c..84530430ae1a 100644
--- a/src/util/cmdline.cpp
+++ b/src/util/cmdline.cpp
@@ -296,13 +296,7 @@ bool cmdlinet::parse_arguments(int argc, const char **argv)
         return true;
       }
 
-      // Work around spurious GCC 12 warning about optnr being uninitialised.
-#pragma GCC diagnostic push
-#ifndef __clang__
-#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
       options[*optnr].isset = true;
-#pragma GCC diagnostic pop
 
       if(options[*optnr].hasval)
       {
diff --git a/src/util/lower_byte_operators.cpp b/src/util/lower_byte_operators.cpp
index 8f68f2f6ccc9..574f318726ec 100644
--- a/src/util/lower_byte_operators.cpp
+++ b/src/util/lower_byte_operators.cpp
@@ -1110,15 +1110,8 @@ static exprt lower_byte_extract_array_vector(
 
   if(num_elements.has_value())
   {
-    exprt::operandst operands;
-    // Work around spurious GCC warning about num_elements being uninitialised.
-#pragma GCC diagnostic push
-#ifndef __clang__
-#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
     operands.reserve(*num_elements);
     for(std::size_t i = 0; i < *num_elements; ++i)
-#pragma GCC diagnostic pop
     {
       plus_exprt new_offset(
         unpacked.offset(),
diff --git a/src/util/simplify_expr_int.cpp b/src/util/simplify_expr_int.cpp
index 5096db9a3bfe..3d132ca47fa3 100644
--- a/src/util/simplify_expr_int.cpp
+++ b/src/util/simplify_expr_int.cpp
@@ -159,12 +159,6 @@ static bool mul_expr(
   return true;
 }
 
-// Work around spurious GCC 12 warning about c_sizeof_type being
-// uninitialised in its destructor (!).
-#pragma GCC diagnostic push
-#ifndef __clang__
-#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
 simplify_exprt::resultt<> simplify_exprt::simplify_mult(const mult_exprt &expr)
 {
   // check to see if it is a number type
@@ -276,7 +270,6 @@ simplify_exprt::resultt<> simplify_exprt::simplify_mult(const mult_exprt &expr)
     return std::move(tmp);
   }
 }
-#pragma GCC diagnostic pop
 
 simplify_exprt::resultt<> simplify_exprt::simplify_div(const div_exprt &expr)
 {