diff --git a/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp b/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp --- a/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp +++ b/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp @@ -50,21 +50,34 @@ return QStringLiteral("-xcuda"); case Utils::ObjC: return QStringLiteral("-xobjective-c"); + case Utils::ObjCpp: + return QStringLiteral("-xobjective-c++"); default: Q_UNREACHABLE(); } } -QString languageStandard(const QString& arguments) +QString languageStandard(const QString& arguments, Utils::LanguageType type) { // TODO: handle -ansi flag: In C mode, this is equivalent to -std=c90. In C++ mode, it is equivalent to -std=c++98. const QRegularExpression regexp(QStringLiteral("-std=(\\S+)")); auto result = regexp.match(arguments); if (result.hasMatch()) return result.captured(0); - // no -std= flag passed -> assume c++11 - return QStringLiteral("-std=c++11"); + switch (type) { + case Utils::C: + case Utils::ObjC: + return QStringLiteral("-std=c99"); + case Utils::Cpp: + case Utils::ObjCpp: + case Utils::Cuda: + return QStringLiteral("-std=c++11"); + case Utils::OpenCl: + return QStringLiteral("-cl-std=CL1.1"); + default: + Q_UNREACHABLE(); + } } } @@ -87,7 +100,7 @@ // TODO: what about -mXXX or -target= flags, some of these change search paths/defines const QStringList compilerArguments{ languageOption(type), - languageStandard(arguments), + languageStandard(arguments, type), QStringLiteral("-dM"), QStringLiteral("-E"), QStringLiteral("-"), @@ -144,7 +157,7 @@ const QStringList compilerArguments{ languageOption(type), - languageStandard(arguments), + languageStandard(arguments, type), QStringLiteral("-E"), QStringLiteral("-v"), QStringLiteral("-"), diff --git a/plugins/custom-definesandincludes/compilerprovider/icompiler.h b/plugins/custom-definesandincludes/compilerprovider/icompiler.h --- a/plugins/custom-definesandincludes/compilerprovider/icompiler.h +++ b/plugins/custom-definesandincludes/compilerprovider/icompiler.h @@ -38,6 +38,7 @@ OpenCl, Cuda, ObjC, + ObjCpp, Other }; diff --git a/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp b/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp --- a/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp +++ b/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp @@ -71,7 +71,12 @@ return QStringLiteral("parserArgumentsOpenCL"); case Utils::Cuda: return QStringLiteral("parserArgumentsCuda"); + // TODO: is there a need for "parserArgumentsObjC[++]" and if so how/where + // if not, merge the ObjC cases with the C/C++ cases. case Utils::ObjC: + return QStringLiteral("parserArgumentsC"); + case Utils::ObjCpp: + return QStringLiteral("parserArguments"); case Utils::Other: break; } @@ -99,7 +104,11 @@ arguments[Utils::Cpp] = QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c++11"); arguments[Utils::OpenCl] = QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -cl-std=CL1.1"); arguments[Utils::Cuda] = QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c++11"); - arguments[Utils::ObjC] = QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c99"); + // For now, use the same arguments for ObjC(++) as for C(++). -Wall enables a number + // of language-specific warnings, removing the need to add them explicitly. + // (https://embeddedartistry.com/blog/2017/3/7/clang-weverything) + arguments[Utils::ObjC] = arguments[Utils::C]; + arguments[Utils::ObjCpp] = arguments[Utils::Cpp]; arguments.parseAmbiguousAsCPP = true; return arguments; @@ -439,6 +448,10 @@ return Cpp; } + if (mimeType == QStringLiteral("text/x-objc++src")) { + return ObjCpp; + } + if (mimeType == QStringLiteral("text/x-objcsrc")) { return ObjC; } diff --git a/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp b/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp --- a/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp +++ b/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp @@ -57,6 +57,8 @@ return QStringLiteral("c++11"); case Utils::ObjC: return QStringLiteral("c99"); + case Utils::ObjCpp: + return QStringLiteral("c++11"); case Utils::Other: break; }