SUMMARY /* BEGIN example.cpp */ #include <mutex> #include <optional> std::mutex mutex; extern std::optional<int> froop(); extern void frob(int val = 0); void func1() { std::unique_lock lock { mutex, std::try_to_lock }; // OK // if-statement with expression condition if (lock) { // OK frob(); lock.unlock(); // OK } } void func2() { // if-statement with declaration condition if (std::unique_lock lock { mutex, std::try_to_lock }) { // OK frob(); lock.unlock(); // OK } } void func3() { // if-statement with initializer and expression condition if (std::unique_lock lock { mutex, std::try_to_lock }; // broken lock.owns_lock()) // broken { frob(); lock.unlock(); // broken } } void func4() { // if-statement with initializer and declaration condition if (std::unique_lock lock { mutex }; // broken auto optval = froop()) // OK { frob(*optval); // OK lock.unlock(); // broken } } /* END example.cpp */ OBSERVED RESULT * If-statement initializers are not fully syntax highlighted. (Only context-insensitive highlighting, such as Kate would do, is performed.) * All variables declared via if-statement initializers are not highlighted at subsequent uses, including within the condition expression of the if-statement. * Note that code completion works as it should. EXPECTED RESULT * KDevelop's syntax highlighter should understand the C++17 if-statement with initializer syntax. * Local variables declared in if-statement initializers should be colored as local variables, both when used in the succeeding if-statement conditions and when used in the statement body/bodies. * Note that local variables declared in if-statement initializers are in scope throughout both the "true" body and the "false" (else) body (if there is one). This is the same scoping rule as for if-statement declaration conditions. SOFTWARE/OS VERSIONS KDE Plasma Version: 5.17.4 KDE Frameworks Version: 5.65.0 Qt Version: 5.14.0
Thanks for the detailed example; tested on Arch with the same result. (I suspected the C++ profile might not be set to C++17 in the project settings, but this bug exists even when that's set appropriately).
Analogous concerns apply for switch-statement with initializer. /* BEGIN example2.cpp */ #include <charconv> #include <limits> #include <system_error> unsigned parse_uint_clamp(const char *begin, const char *end) { unsigned v; switch (auto [ptr, ec] = std::from_chars(begin, end, v); ec) { // broken case std::errc { }: if (ptr != end) { // broken return 0; } return v; case std::errc::result_out_of_range: return std::numeric_limits<unsigned>::max(); default: throw std::system_error(std::make_error_code(ec)); // broken } } /* END example2.cpp */