From e2e3be09e36f89f4db92c443ec9f7fb1dab70624 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 12 Apr 2016 13:11:01 +0200 Subject: [PATCH] Clang: Enable exceptions explicitly For some reason, clang 3.8.0 on Windows does not enable exceptions anymore, which leads to parse errors in MSVC headers (reported upstream [1]). With this change, we can finally parse main/mainwindow.cpp of a Qt Widgets Application for a MSVC2015 Kit and libclang 3.8.0 without any error. [1] https://llvm.org/bugs/show_bug.cgi?id=27324 Change-Id: I532ad4852a06318baf083d363378bc577b3c4309 Reviewed-by: Christian Kandeler --- src/plugins/clangcodemodel/clangutils.cpp | 1 + .../clangstaticanalyzerruncontrol.cpp | 13 ++++++++++--- src/plugins/cpptools/compileroptionsbuilder.cpp | 6 ++++++ src/plugins/cpptools/compileroptionsbuilder.h | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index dcd704b22f1..5a03ffd3388 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -91,6 +91,7 @@ public: optionsBuilder.addTargetTriple(); optionsBuilder.addLanguageOption(fileKind); optionsBuilder.addOptionsForLanguage(/*checkForBorlandExtensions*/ true); + optionsBuilder.enableExceptions(); optionsBuilder.addToolchainAndProjectDefines(); optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015(); diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index 2ad3cdf9f18..6899cde2273 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -169,6 +169,7 @@ public: optionsBuilder.addTargetTriple(); optionsBuilder.addLanguageOption(fileKind); optionsBuilder.addOptionsForLanguage(false); + optionsBuilder.enableExceptions(); // In gcc headers, lots of built-ins are referenced that clang does not understand. // Therefore, prevent the inclusion of the header that references them. Of course, this @@ -184,9 +185,7 @@ public: optionsBuilder.addHeaderPathOptions(); optionsBuilder.addMsvcCompatibilityVersion(); - if (type == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) - optionsBuilder.add(QLatin1String("/EHsc")); // clang-cl does not understand exceptions - else + if (type != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) optionsBuilder.add(QLatin1String("-fPIC")); // TODO: Remove? QStringList options = optionsBuilder.options(); @@ -240,6 +239,14 @@ private: return CompilerOptionsBuilder::defineOption(); } + void enableExceptions() override + { + if (m_isMsvcToolchain) + add(QLatin1String("/EHsc")); + else + CompilerOptionsBuilder::enableExceptions(); + } + private: bool m_isMsvcToolchain; }; diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 5b176286826..43605a075bd 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -92,6 +92,12 @@ void CompilerOptionsBuilder::addTargetTriple() } } +void CompilerOptionsBuilder::enableExceptions() +{ + add(QLatin1String("-fcxx-exceptions")); + add(QLatin1String("-fexceptions")); +} + void CompilerOptionsBuilder::addHeaderPathOptions() { typedef ProjectPartHeaderPath HeaderPath; diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h index 93fba1ef09f..e48cf99fdd4 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.h +++ b/src/plugins/cpptools/compileroptionsbuilder.h @@ -46,6 +46,7 @@ public: // Add options based on project part virtual void addTargetTriple(); + virtual void enableExceptions(); void addHeaderPathOptions(); void addToolchainAndProjectDefines(); virtual void addLanguageOption(ProjectFile::Kind fileKind);