Prevent `-Weffc++` and `-W-ctor-dtor-privacy` warnings from leaking out
- Dominant language
- C++
- Stars
- 21.5k
- Forks
- 3.5k
- Avg merge
- 3d 16h
- Merged PRs (30d)
- 2
Description
**Description**
I updated Catch2 used in my project from some old Catch2v2 version to v3. When including Catch2 in my project tests through the CMake fetcher as a dependency, compiling the project with Clang (clang 17.0.6) does not issue any warnings, but compiling with GCC (g++ 13.3.0) issues a number of `-Weffc++` and `-W-ctod-dtor-privacy` warnings.
I presume the code in Catch2 is supposed to behave as it does. Therefore, suppressing these warnings on a per-header file level should be the correct answer (or anything similar to this) to removing these warnings, while still allowing the users of Catch2 to include specific header files with the warnings set up for their tests source code.
**Steps to reproduce**
CMake snippet:
```cmake
if (BUILD_TESTING)
# Catch2 library for writing tests
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.7.1
)
FetchContent_MakeAvailable(Catch2)
list(APPEND CMAKE_MODULE_PATH ${Catch2_SOURCE_DIR}/contrib)
include(Catch)
endif()
target_link_libraries(tests PRIVATE Catch2::Catch2WithMain)
```
Tests source C++ file:
```cpp
#include
#include
// Tests.
```
**Additional context**
Generated warnings:
- (binary) `user-defined ::operator ... always evaluates both arguments`,
- `all member functions in class are private`,
- ` has pointer data members ... but does not declare ...`,
- ...
Log of the build process: [warnings.txt](https://github.com/user-attachments/files/17585330/warnings.txt).
**Suggested alternative**
There are a number of options to suppress these warnings.
Manually, each user can disable the warnings for each test source file, for example by wrapping the includes of Catch2 headers in pragmas:
```cpp
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include
#include
#pragma GCC diagnostic pop
```
I also managed to suppress the warnings on a per-project basis by setting the Catch2 library as a system library in CMake: (include inside the above-mentioned CMake code after the line `include(Catch)`):
```cmake
get_target_property(catch2_includes Catch2 INTERFACE_INCLUDE_DIRECTORIES)
target_include_directories(Catch2 SYSTEM INTERFACE ${catch2_includes})
```
Nevertheless, I think that the preferred approach would be to suppress these warnings on the Catch2 side once and for all (whichever approach is chosen), as opposed to forcing each user of Catch2 to suppress the warnings manually in their projects.
**Related issues**
https://github.com/catchorg/Catch2/issues/208
https://github.com/catchorg/Catch2/issues/407
Contributor guide
Research direction
Start by reproducing the GCC 13.3.0 build with the listed Catch2 headers, then inspect how the Catch2 include targets and headers are exposed through CMake FetchContent. The work is done when -Weffc++ and -W-ctor-dtor-privacy warnings no longer leak from Catch2 while consumer diagnostics remain effective.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cmake, cpp
- Domain
- build-system, testing-qa
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100