Skip to content

Commit b19a700

Browse files
Update example to C++20 and use modules
1 parent cd72736 commit b19a700

File tree

5 files changed

+84
-24
lines changed

5 files changed

+84
-24
lines changed

.github/workflows/build.yml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ on:
55
- main
66
pull_request:
77
types: [opened, synchronize, reopened]
8+
env:
9+
CLANG_VERSION: 18
810
jobs:
911
build:
1012
name: Build
@@ -15,10 +17,22 @@ jobs:
1517
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
1618
- name: Install sonar-scanner
1719
uses: sonarsource/sonarcloud-github-c-cpp@v3
18-
- name: Generate compilation database
20+
- name: Install Ninja
21+
run: |
22+
wget https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux.zip
23+
sudo unzip ninja-linux.zip -d /usr/local/bin
24+
- name: Install clang
25+
run: |
26+
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ${{env.CLANG_VERSION}}
27+
sudo apt install -y clang-tools-${{env.CLANG_VERSION}} libc++-${{env.CLANG_VERSION}}-dev
28+
- name: Generate compilation database and build
1929
run: |
2030
mkdir build
21-
cmake -S . -B build
31+
cmake -S . -B build -G Ninja \
32+
-DCMAKE_CXX_COMPILER=clang++-${{env.CLANG_VERSION}} \
33+
-DCMAKE_CXX_COMPILER_CLANG_SCAN_DEPS=clang-scan-deps-${{env.CLANG_VERSION}}
34+
# The project needs to be built so the `.modmap` files are generated
35+
cmake --build build --target all
2236
- name: Run sonar-scanner
2337
env:
2438
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

CMakeLists.txt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
cmake_minimum_required(VERSION 3.9)
2-
project(sonar_scanner_example)
1+
cmake_minimum_required(VERSION 3.30)
2+
3+
project(sonar_scanner_example LANGUAGES CXX)
4+
5+
set(CMAKE_CXX_STANDARD 20)
6+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
7+
set(CMAKE_CXX_EXTENSIONS OFF)
8+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
39

4-
set(CMAKE_CXX_STANDARD 17)
510
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
611

712
add_executable(sonar_scanner_example src/main.cpp)
8-
13+
target_sources(sonar_scanner_example
14+
PRIVATE
15+
FILE_SET CXX_MODULES FILES src/args.cppm
16+
)

sonar-project.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ sonar.projectVersion=1.0-SNAPSHOT
1010

1111
# SQ standard properties
1212
sonar.sources=src
13+
# Enable C++20 modules
14+
sonar.cfamily.enableModules=true

src/args.cppm

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
module;
2+
#include <iostream>
3+
#include <string_view>
4+
#include <variant>
5+
6+
export module args;
7+
8+
export namespace args {
9+
10+
enum class Error {
11+
Ok,
12+
TooLong,
13+
TooManyArgs,
14+
NullPtr,
15+
};
16+
17+
std::variant<std::string_view, Error> process_args(int argc, char *argv[]) {
18+
int num = argc - 1;
19+
20+
if (num == 0) {
21+
std::cout << "No arguments provided\n";
22+
} else if (num == 0) { // intentional mistake
23+
std::cout << "1 argument provided\n";
24+
} else if (num == 2) {
25+
std::cout << "2 arguments provided\n";
26+
} else {
27+
std::cout << num << " arguments provided\n";
28+
}
29+
if (argv != 0) {
30+
std::cout << "argv not null\n";
31+
; // intentional extra-semicolon
32+
}
33+
34+
if (argv == nullptr) {
35+
return std::string_view(*argv); // intentional nullptr dereference
36+
}
37+
38+
return std::string_view(argv[0]);
39+
}
40+
} // namespace args

src/main.cpp

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
#include <iostream>
2+
#include <variant>
23

3-
using namespace std;
4+
import args;
45

5-
int main(int argc, char* argv[]) {
6-
int num = argc - 1;
6+
using namespace std;
77

8-
if (num == 0) {
9-
cout << "No arguments provided\n";
10-
} else if (num == 0) { // intentional mistake
11-
cout << "1 argument provided\n";
12-
} else if (num == 2) {
13-
cout << "2 arguments provided\n";
14-
} else {
15-
cout << num << " arguments provided\n";
16-
}
17-
if (argv != 0) {
18-
cout << "argv not null\n";; // intentional extra-semicolon
19-
}
20-
if (argv == nullptr) {
21-
return **argv; // intentional nullptr dereference
8+
int main(int argc, char *argv[]) {
9+
auto get_proc_name = args::process_args(argc, argv);
10+
if (std::holds_alternative<args::Error>(get_proc_name)) {
11+
switch (std::get<args::Error>(get_proc_name)) {
12+
case args::Error::TooLong:
13+
std::cout << "Proc name too long\n";
14+
return 1;
15+
}
16+
return 0;
2217
}
2318

19+
auto &&value = std::get<std::string_view>(get_proc_name);
20+
std::cout << value << '\n';
2421
return 0;
2522
}
26-

0 commit comments

Comments
 (0)