diff --git a/languages/clang/duchain/parsesession.cpp b/languages/clang/duchain/parsesession.cpp --- a/languages/clang/duchain/parsesession.cpp +++ b/languages/clang/duchain/parsesession.cpp @@ -72,6 +72,12 @@ return {QByteArrayLiteral("-xobjective-c++")}; } + // TODO: No proper mime type detection possible yet + // cf. https://bugs.freedesktop.org/show_bug.cgi?id=26913 + if (path.endsWith(QLatin1String(".cl"), Qt::CaseInsensitive)) { + return {QByteArrayLiteral("-xcl")}; + } + if (parserSettings.parserOptions.isEmpty()) { // The parserOptions can be empty for some unit tests that use ParseSession directly auto defaultArguments = ClangSettingsManager::self()->parserSettings(path).toClangAPI(); diff --git a/languages/clang/kdevclangsupport.json b/languages/clang/kdevclangsupport.json --- a/languages/clang/kdevclangsupport.json +++ b/languages/clang/kdevclangsupport.json @@ -56,6 +56,7 @@ "X-KDevelop-Languages": [ "C", "C++", + "OpenCL", "Objective-C" ], "X-KDevelop-LoadMode": "AlwaysOn", @@ -65,6 +66,7 @@ "text/x-c++hdr", "text/x-csrc", "text/x-c++src", + "text/x-openclsrc", "text/x-objcsrc" ] } diff --git a/languages/clang/tests/files/test.cl b/languages/clang/tests/files/test.cl new file mode 100644 --- /dev/null +++ b/languages/clang/tests/files/test.cl @@ -0,0 +1,15 @@ +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#pragma OPENCL EXTENSION cl_khr_fp64 : enable + +typedef half half4 __attribute__((ext_vector_type(4))); +typedef float float4 __attribute__((ext_vector_type(4))); +typedef double double4 __attribute__((ext_vector_type(4))); + +void kernel testFloatTypes() { + half scalarHalf; + half4 vectorHalf; + float scalarFloat; + float4 vectorFloat; + double scalarDouble; + double4 vectorDouble; +} diff --git a/languages/clang/tests/test_files.cpp b/languages/clang/tests/test_files.cpp --- a/languages/clang/tests/test_files.cpp +++ b/languages/clang/tests/test_files.cpp @@ -68,7 +68,7 @@ { QTest::addColumn("fileName"); const QString testDirPath = TEST_FILES_DIR; - const QStringList files = QDir(testDirPath).entryList({"*.h", "*.cpp", "*.c"}, QDir::Files); + const QStringList files = QDir(testDirPath).entryList({"*.h", "*.cpp", "*.c", "*.cl"}, QDir::Files); foreach (const QString& file, files) { QTest::newRow(file.toUtf8().constData()) << QString(testDirPath + '/' + file); } diff --git a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h --- a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h +++ b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h @@ -36,17 +36,10 @@ struct ParserArguments { - ParserArguments(const QString& cArguments, const QString& cppArguments, bool parseAmbiguousAsCPP) - : cArguments(cArguments) - , cppArguments(cppArguments) - , parseAmbiguousAsCPP(parseAmbiguousAsCPP) - {} - - ParserArguments() = default; - QString cArguments; QString cppArguments; - bool parseAmbiguousAsCPP = true; + QString openClArguments; + bool parseAmbiguousAsCPP; }; Q_DECLARE_METATYPE(ParserArguments); @@ -71,6 +64,7 @@ { C, Cpp, + OpenCl, ObjC, Other = 100 diff --git a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp --- a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp +++ b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp @@ -82,10 +82,10 @@ ParserArguments defaultArguments() { - const static ParserArguments arguments - { + const static ParserArguments arguments{ QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c99"), QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c++11"), + QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall"), true }; @@ -399,6 +399,12 @@ } } + // TODO: No proper mime type detection possible yet + // cf. https://bugs.freedesktop.org/show_bug.cgi?id=26913 + if (path.lastPathSegment().endsWith(QLatin1String(".cl"), Qt::CaseInsensitive)) { + return OpenCl; + } + return C; } diff --git a/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp b/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp --- a/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp +++ b/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp @@ -330,24 +330,40 @@ m_backgroundProviders.push_back(provider); } +QString argumentsForPath(const Path& path, const ParserArguments& arguments) +{ + auto languageType = Utils::languageType(path, arguments.parseAmbiguousAsCPP); + switch (languageType) { + case Utils::C: + return arguments.cArguments; + case Utils::Cpp: + return arguments.cppArguments; + case Utils::OpenCl: + return arguments.openClArguments; + case Utils::ObjC: + return QString(); + case Utils::Other: + return QString(); + } + Q_UNREACHABLE(); + return QString(); +} + QString DefinesAndIncludesManager::parserArguments(KDevelop::ProjectBaseItem* item) const { Q_ASSERT(item); Q_ASSERT(QThread::currentThread() == qApp->thread()); auto cfg = item->project()->projectConfiguration().data(); const auto arguments = findConfigForItem(m_settings->readPaths(cfg), item).parserArguments; - auto languageType = Utils::languageType(item->path(), arguments.parseAmbiguousAsCPP); - - return languageType == Utils::C ? arguments.cArguments : arguments.cppArguments; + return argumentsForPath(item->path(), arguments); } QString DefinesAndIncludesManager::parserArguments(const QString& path) const { const auto args = m_settings->defaultParserArguments(); - auto languageType = Utils::languageType(Path(path)); - return languageType == Utils::C ? args.cArguments : args.cppArguments; + return argumentsForPath(Path(path), args); } int DefinesAndIncludesManager::perProjectConfigPages() const diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp --- a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp +++ b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp @@ -144,7 +144,7 @@ ParserArguments ParserWidget::parserArguments() const { - return {m_ui->parserOptionsC->text(), m_ui->parserOptionsCpp->text(), !m_ui->parseHeadersInPlainC->isChecked()}; + return {m_ui->parserOptionsC->text(), m_ui->parserOptionsCpp->text(), {}, !m_ui->parseHeadersInPlainC->isChecked()}; } void ParserWidget::updateEnablements()