From c6aae718bdb2a889e3faf3c896fadeaa04afe73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Mon, 3 Dec 2018 12:17:50 +0100 Subject: [PATCH 1/3] Add support for -fXX feature flags --- include/cppast/compile_config.hpp | 15 +++++++++++++++ include/cppast/libclang_parser.hpp | 2 ++ src/libclang/libclang_parser.cpp | 6 ++++++ 3 files changed, 23 insertions(+) diff --git a/include/cppast/compile_config.hpp b/include/cppast/compile_config.hpp index 67db492..b9de7d6 100644 --- a/include/cppast/compile_config.hpp +++ b/include/cppast/compile_config.hpp @@ -74,6 +74,13 @@ public: do_set_flags(standard, flags); } + /// \effects Enables an `-fXXX` flag. + /// \returns Whether or not it was a known feature and enabled. + bool enable_feature(std::string name) + { + return do_enable_feature(name); + } + /// \effects Adds the given path to the set of include directories. void add_include_dir(std::string path) { @@ -121,6 +128,14 @@ private: /// \effects Sets the given C++ standard and compilation flags. virtual void do_set_flags(cpp_standard standard, compile_flags flags) = 0; + /// \effects Sets the given feature flags. + /// \returns Whether or not it was a known feature and set. + virtual bool do_enable_feature(std::string name) + { + (void)name; + return false; + } + /// \effects Adds the given path to the set of include directories. virtual void do_add_include_dir(std::string path) = 0; diff --git a/include/cppast/libclang_parser.hpp b/include/cppast/libclang_parser.hpp index 2d1fa52..a2afe9d 100644 --- a/include/cppast/libclang_parser.hpp +++ b/include/cppast/libclang_parser.hpp @@ -157,6 +157,8 @@ public: private: void do_set_flags(cpp_standard standard, compile_flags flags) override; + bool do_enable_feature(std::string name) override; + void do_add_include_dir(std::string path) override; void do_add_macro_definition(std::string name, std::string definition) override; diff --git a/src/libclang/libclang_parser.cpp b/src/libclang/libclang_parser.cpp index 94dd70e..85dddc1 100644 --- a/src/libclang/libclang_parser.cpp +++ b/src/libclang/libclang_parser.cpp @@ -386,6 +386,12 @@ void libclang_compile_config::do_set_flags(cpp_standard standard, compile_flags add_flag("-fms-extensions"); } +bool libclang_compile_config::do_enable_feature(std::string name) +{ + add_flag("-f" + std::move(name)); + return true; +} + void libclang_compile_config::do_add_include_dir(std::string path) { add_flag("-I" + std::move(path)); From 336a00946d7874c22b087b48362887c205423f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Mon, 3 Dec 2018 12:20:32 +0100 Subject: [PATCH 2/3] Parse feature flags in compilation database --- src/libclang/libclang_parser.cpp | 2 +- test/libclang_parser.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libclang/libclang_parser.cpp b/src/libclang/libclang_parser.cpp index 85dddc1..024a259 100644 --- a/src/libclang/libclang_parser.cpp +++ b/src/libclang/libclang_parser.cpp @@ -237,7 +237,7 @@ libclang_compile_config::libclang_compile_config(const libclang_compilation_data else if (flag == "-std") // standard add_flag(std::move(flag) + "=" + std::move(args)); - else if (flag == "-f" && (args == "ms-compatibility" || args == "ms-extensions")) + else if (flag == "-f") // other options add_flag(std::move(flag) + std::move(args)); }); diff --git a/test/libclang_parser.cpp b/test/libclang_parser.cpp index c1762cb..e5e2ffc 100644 --- a/test/libclang_parser.cpp +++ b/test/libclang_parser.cpp @@ -58,7 +58,7 @@ TEST_CASE("libclang_compile_config") }, { "directory": "", - "command": "/usr/bin/clang++ -std=c++14 -fms-extensions -fms-compatibility -c -o c.o c.cpp", + "command": "/usr/bin/clang++ -std=c++14 -fms-extensions -fms-compatibility -fno-strict-aliasing -c -o c.o c.cpp", "file": "C:/c.cpp", } ])"; @@ -84,7 +84,7 @@ TEST_CASE("libclang_compile_config") }, { "directory": "", - "command": "/usr/bin/clang++ -std=c++14 -fms-extensions -fms-compatibility -c -o c.o c.cpp", + "command": "/usr/bin/clang++ -std=c++14 -fms-extensions -fms-compatibility -fno-strict-aliasing -c -o c.o c.cpp", "file": "/c.cpp", } ])"; @@ -104,5 +104,5 @@ TEST_CASE("libclang_compile_config") "/absolute -DB(X)=X"); libclang_compile_config c(database, CPPAST_DETAIL_DRIVE "/c.cpp"); - require_flags(c, "-std=c++14 -fms-extensions -fms-compatibility"); + require_flags(c, "-std=c++14 -fms-extensions -fms-compatibility -fno-strict-aliasing"); } From 4860bf698105cb6ef959888058ac5d23f483bcde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Mon, 3 Dec 2018 12:24:23 +0100 Subject: [PATCH 3/3] Add command line option for feature flags --- tool/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tool/main.cpp b/tool/main.cpp index c62132e..8ce0af8 100644 --- a/tool/main.cpp +++ b/tool/main.cpp @@ -207,6 +207,8 @@ int main(int argc, char* argv[]) try cxxopts::value>()) ("U,macro_undefinition", "undefine a macro on the command line", cxxopts::value>()) + ("f,feature", "enable a custom feature (-fXX flag)", + cxxopts::value>()) ("gnu_extensions", "enable GNU extensions (equivalent to -std=gnu++XX)") ("msvc_extensions", "enable MSVC extensions (equivalent to -fms-extensions)") ("msvc_compatibility", "enable MSVC compatibility (equivalent to -fms-compatibility)") @@ -275,6 +277,9 @@ int main(int argc, char* argv[]) try if (options.count("macro_undefinition")) for (auto& name : options["macro_undefinition"].as>()) config.undefine_macro(name); + if (options.count("feature")) + for (auto& name : options["feature"].as>()) + config.enable_feature(name); // the compile_flags are generic flags cppast::compile_flags flags;