diff --git a/autotests/folding/example.rmd.fold b/autotests/folding/example.rmd.fold index 856c3ea..c198d13 100644 --- a/autotests/folding/example.rmd.fold +++ b/autotests/folding/example.rmd.fold @@ -1,39 +1,39 @@ --- -title: "test" -author: "me" -date: "07.10.2014" +title: "test" +author: "me" +date: "07.10.2014" output: html_document --- This is a simple test document. It shows syntax highlighting switches between YAML (above), R blocks ```{r, echo=FALSE} for (i in 1:10) { if(i>=10) print(i) } # two blank lines below sessionInfo() ``` LaTeX equations, $$ h_{i}(t \mid q,C) = h_{0}(t) e^{\beta_{1}quality_{i} + \beta_{2}C_{iq}} $$ and Markdown. A [link](http://example.com) in Markdown. Inline `r y <- 5 + x - sin(3)` R code. Inline `y <- 5 + x - sin(3)` code. Heading ======= Sub-heading ----------- A list of editors: * kate * vim * emacs *italic*, **bold**, `monospace` diff --git a/autotests/folding/folding.cpp.fold b/autotests/folding/folding.cpp.fold index 68e89c3..be50e40 100644 --- a/autotests/folding/folding.cpp.fold +++ b/autotests/folding/folding.cpp.fold @@ -1,15 +1,15 @@ -/** +/** * multi-line comment - */ + */ -/* comment */ -{ { } { -//BEGIN -} -//END -} +/* comment */ +{ { } { +//BEGIN +} +//END +} -#if 0 -#elif 1 -#else -#endif +#if 0 +#elif 1#elif 1 +#else#else +#endif diff --git a/autotests/folding/highlight.cpp.fold b/autotests/folding/highlight.cpp.fold index ba8adfa..9f9fbc4 100644 --- a/autotests/folding/highlight.cpp.fold +++ b/autotests/folding/highlight.cpp.fold @@ -1,296 +1,494 @@ #pragma once #include #include #include "assert.h" -#include "assert.hpp" +#include "assert.hpp" // abc #include "path/assert.hpp" +#include "assert.h"a +#include "assert.h" a +#include a +#include a +#include FOO() error +#include_next a +#include_next /* a + */ b +#include PATH_IN_MACRO #include PATH_IN_MACRO() +#include PATH_IN_MACRO(a, b) #define SOME_VAR 1 -#ifdef SOME_VAR +#ifdef SOME_VAR #define MULTILINE_MACRO one \ two \ three # define MULTILINE_MACRO_TEXT \ - /* NOTE The contents of macro is too green :D */ \ + /* NOTE The contents of macro is too green :D */ \ char const s[] = "a\\b" \ "c\nd" +# define VARIADIC(a, ...) \ + f(a##a) \ + f(__VA_ARGS__) \ + f(#__VA_ARGS__) \ + f(__VA_ARGS__) \ + f(0 __VA_OPT__(,) __VA_ARGS__) \ + x __VA_OPT__(= { __VA_ARGS__ }) + +# define MACRO() BAD \ ESCAPED + # error dds # warning dds # line 2 "file.cpp" # define A(x, y) x##y x#y // OK(L, a) -> L"a" # define OK(x, y) x###y # define BAD(x, y) x####y +# define A /* multi line +with comment */ expr +# define A /* multi line +with comment */ +23 +#else // xelse // x +#42 // gcc extension = #line 42 + +// error +#wrong +# wrong +#endif x +#if DS() +#else xelse x +#else /* */xelse /* */x +#else /* xelse /* x +y */ z +#endif static int g_global; template class = std::is_pointer> struct class1 : private std::vector, public U -{ +{ class1() try : _member1(xxx) - {} + {} catch(...) - {} + {} + + class1(class1&&) = default; ~class1() - {} - - void foo() { return; } - void foo() const { return; } - void foo() noexcept { return; } - void foo() const noexcept { return; } - virtual void foo() const noexcept { return; } - static void foo() { return; } + {} + + void foo() { return; } + void foo() const { return; } + void foo() noexcept { return; } + void foo() const noexcept { return; } + virtual void foo() const noexcept { return; } + static void foo() { return; } constexpr static void foo() const noexcept(noexcept(std::is_pointer::value)) override - { - xxx::template ttt::type {}; + { + xxx::template ttt::type {}; xxx.template get(); xxx.std::rdbuf(); auto x = C<'a'> + y; - } + } int operator->*(T (C::*m)(int)); operator value_t (); private: protected: public: value_type _member1; // NOTE internal ? value_type __internal; value_type internal__; value_type _M_internal; value_t member2_; value_type m_member3; static int s_static; -}; + static constexpr int s_static; + static inline int s_static; + static inline constexpr int s_static; +}; constexpr struct : xyz -{ +{ using xyz::xyz; using xyz::operator=; int a : 1; int b : 7; -} x {}; +} x {}; template using is_pointer = std::is_pointer::type; template constexpr auto is_pointer_v = std::is_pointer::value; uint64_t namespaces() -{ +{ std::vector; boost::vector; detail::vector; details::vector; aux::vector; internals::vector; other::vector; -} +} + +#if 1 + double foo(const A); +#else // else#else // else + double foo(const A); +#endif // end + +#if 0 + double foo(const A); +#else // else#else // else + double foo(const A); +#endif // end + +#if 1 + double foo(const A); +#elif 1#elif 1 + double foo(const A); +#elif 0 + double foo(const A); +#endif // end + +#if 0 + double foo(const A); +#elif 1#elif 1 + double foo(const A); +#elif 0#elif 0 + double foo(const A); +#endif // end + +#if 0 + double foo(const A); +#elif a#elif a + double foo(const A); +#elif 0elif 0 + double foo(const A); +#elif a#elif a + double foo(const A); +#else // elseelse // else + double foo(const A); +#endif // end + +#if 0 // blah blah + double foo(const A); +#elif 1 // blah blah#elif 1 // blah blah + double foo(const A); +#else // else#else // else + double foo(const A); +#endif // end + +#if 0 || a + double foo(const A); +#else // elseelse // else + double foo(const A); +#endif // end + +#if 1 || a + double foo(const A); +#else // else#else // else + double foo(const A); +#endif // end + +#if 0 && a + double foo(const A); +#else // elseelse // else + double foo(const A); +#endif // end -#if 1 +#if 1 && a double foo(const A); -#else +#else // elseelse // else double foo(const A); -#endif +#endif // end -#if 0 +#if a double foo(const A); -#else +#elif 0elif 0 double foo(const A); -#endif +#endif // end + +#if a + double foo(const A); +#elif 1elif 1 + double foo(const A); +#endif // end + +#if a + double foo(const A); +#elif aelif a + double foo(const A); +#endif // end int bar(void*p, void * pp) -{ -# if 0 +{ +# if 0 double foo(); -# else +# else // else# else // else double foo(); -# endif -} +# endif // end +} + +#if abc 0 + double foo(); +#endif // end + +#if xxx + double foo(); +#elseelse + double foo(); +#endif // end + +#if xxx + double foo(); +#elif xxx // elseifelif xxx // elseif + double foo(); +#elif xxx // elseifelif xxx // elseif + double foo(); +#endif // end + +// error +# +#d +# d +#if +#elifelif +#endif +#ifndef +#endif +#ifdef 0 +#endif // end static uint64_t intWithSuffix = 42ull; static long intWithSuffixAndPrefix = 0b0101L; static int octNum = 07232; static int invalidOctNum = 09231; static uint64_t hexNum = 0xDEADBEEF42; static uint64_t invalidHexNum = 0xGLDFKG; static char binNum = 0b0101010; static int64_t intWithSuffix = -42LL; -static long intWithSuffixAndPrefix = -0b0101L; // BUG +static long intWithSuffixAndPrefix = -0b0101L; static int octNum = -07232; static int invalidOctNum = -09231; static int64_t hexNum = -0xDEADBEEF42; static int64_t invalidHexNum = -0xGLDFKG; static char binNum = -0b0101010; static uint64_t intWithSuffixWithSep = 4'2ull; static long intWithSuffixAndPrefixWithSep = 0b0'10'1L; static int octNumWithSep = 07'232; static int invalidOctNumWithSep = 09'23'1; static uint64_t hexNumWithSep = 0xD'EAD'BE'EF'42; static uint64_t invalidHexNumWithSep = 0xGLD'FKG; static char binNumWithSep = 0b0'1010'10; +static uint64_t invalidSep = 42'ull; +static uint64_t invalidSep = 42'; + static double d1 = 42.; static double d2 = .42; static double d2a = -0.49; static double d2b = -0.09; static double d3 = 42.3e1; static double d4 = .2e-12; static double d5 = 32.e+12; static double invalidD1 = 32.e+a12; static float floatQualifier = 23.123f; -// TODO c++17 +// Hexadecimal floating point (c++17) static double d6 = 0x1ffp10; static double d7 = 0X0p-1; static double d8 = 0x1.p0; -static double d9 = 0xf.p-1; +static double d9 = 0xf.p-1L; static double d10 = 0x0.123p-1; static double d11 = 0xa.bp10l; static double invalidD2 = 0x0.123p-a; static float floatQualifier = 0xf.p-1f; +60min; // c++17 +23._f +23._fd +2.3_f +2.3_fd +2._f +2._fd +2e4_f +2e4_fd + +// error +23.fd +2e_fd +2e +1.y +1.0_E+2.0 +1.0_E +2.0 // ok +1_p+2 +1_p +2 // ok +4s.count() +4s. count() +4s .count() // ok + static bool yes = true; static bool no = false; - -static const char c1 = 'c'; -static const char c1a = u8'c'; // TODO c++17 -static const char16_t c1b = u'c'; -static const char32_t c1c = U'c'; -static const wchar_t c1d = L'c'; +// *char* +static const char c1 = 'c'; +static const char c1a = u8'c'; // utf-8 char (c++17) +static const char16_t c1b = u'c'; +static const char32_t c1c = U'c'; +static const wchar_t c1d = L'c'; static const char c2 = '\n'; static const char c2a = '\120'; // octal static const char c2b = '\x1f'; // hex static const char c2c = '\''; static const char c2d = '\\'; +static const wchar_t c2e = L'\x1ff'; // hex +static const wchar_t c2e = U'\x1fffffff'; // hex +// error +'\x123'; +'\u1234'; +'\U12345678'; +U'\u12345'; +u'\u123'; +U'\U1234567'; +U'\U123456789'; +U'\x123456789'; + +// string static const char* c3 = "string"; static const char* c4 = "\"string\n\t\012\x12\""; static const char* c5 = "multiline \ string"; static const char* c6 = "multifragment" "other""string"; static const char* c6a = u8"string"; static const char16_t* c6b = u"string"; static const char32_t* c6c = U"string"; static const wchar_t* c6d = L"string"; static const char* rawString1 = R"(string)"; static const char* rawString1a = u8R"(string)"; static const char16_t* rawString1b = uR"(string)"; static const char32_t* rawString1c = UR"(string)"; static const wchar_t* rawString1d = LR"(string\nstring)"; static const char* rawString2 = R"ab(string\nstring)ab"; static const char* rawString3 = R"ab(string string)ab"; +" %d %df fd" U"ds %d" R"(a%d)"; + "\x123xsk"; + u"\x123xsk"; +// error +u8"\x123xsk"; // UDL (c++11) -operator""_a(const char*); // BUG operator not colorized -operator ""_a(const char*); // BUG colorized or -operator "" _a(const char*); // BUG or not colorized +operator""_a(const char*); +operator ""_a(const char*); +operator "" _a(const char*); +// invalid suffix operator "" a(const char*); -operator ""a(const char*); // BUG -operator""a(const char*); // BUG +operator ""a(const char*); +operator""a(const char*); -"string"_s; // BUG colorized or -"string"s; // BUG or not colorized +"string"_s; // user +"string"s; // standard "string"_s-b; // -b is not part of the string // Macro MY_XXX; BOOST_XXX; __STDC_VERSION__; __TIME__; __cplusplus; // Attributes [[noreturn]] void foo(); [[deprecated]] void foo(); [[deprecated("because")]] void foo(); void foo([[carries_dependency]] int); [[opt(1), debug]] [[using CC: opt(1), debug]] // c++17 [[using CC: CC::opt(1)]] // c++17 +[[gnu::assume_aligned(3'2l,2)]] void* f(); +[[using gnu: assume_aligned(3)]] +[[clang::assume_aligned(3)]] + void f([[maybe_unused]] int val) -{ +{ [[maybe_unused]] int x; - switch (x = foo(); x) { + switch (x = foo(); x) { case 1: [[fallthrough]]; case XXX: case Class::foo(): [[fallthrough]]; default: ; - } + } // c++17: fold expression (args + ... + (1 * 2)); (v.push_back(args), ...); [[omp::parallel]] for (auto&& x : v) x; - for (auto&& [first,second] : mymap) { - } + for (auto&& [first,second] : mymap) { + } auto [x, y] = foo(); - [x = 1, =y](){}; + [x = 1, =y](){}; decltype((auto)) x = foo(); -} +} auto f() -> decltype(foo()); __attribute__((pure)) void f(); label: goto label; -//BEGIN region +//BEGIN region // TODO comment FIXME comment ### comment BUG comment -//END region - -#wrong +//END region // \brief blah blah /// \brief blah blah -/** +/** * Doxygen * @param p1 text * \brief bold text - * \dot + * \dot * a -> b - * \enddot + * \enddot * - * \verbatim + * \verbatim * - * \endverbatim + * \endverbatim * text - */ + */ -#endif +#endif // Some GNU macros, cross-referenced from gcc.xml to isocpp.xml __GCC_ATOMIC_CHAR16_T_LOCK_FREE __GNUC__ __linux__ diff --git a/autotests/folding/highlight.lex.fold b/autotests/folding/highlight.lex.fold index 5e9d693..d2336c7 100644 --- a/autotests/folding/highlight.lex.fold +++ b/autotests/folding/highlight.lex.fold @@ -1,82 +1,82 @@ /* This test file tests kates Lex/Flex highlighting */ %option c++ %option yyclass="KateTester" %option yylineno - /* This is a C(++) comment */ + /* This is a C(++) comment */ /* This one is a lex comment ! */ %{ #include #include "realparser.hpp" using namespace std; %} /* Some definitions */ DIGIT [0-9] LETTER [_a-zA-Z] %%%% - /* Comment *shall be indented here* */ + /* Comment *shall be indented here* */ [ \t\n\r]+ - /* Note: there is a bad } just here vvv */ + /* Note: there is a bad } just here vvv */ \/\*([^\*]|\*[^/])*\*\/ { foo(a, b, c); } } - /* A start condition scope... */ + /* A start condition scope... */ { "a" { - /* C mode ! */ + /* C mode ! */ return 0; } "b" %{ - /* C mode, too ! */ + /* C mode, too ! */ return 0; %} "c" return 0; // C++ comment } - /* Big rule */ + /* Big rule */ \"([^"\\]|\\.)*\" { yylval.string_val = new char[strlen(yytext) + 1]; int j = 0, i = 1; while (yytext[i] != '"') if (yytext[i] != '\\') yylval.string_val[j++] = yytext[i++]; else switch (yytext[i + 1]) { case 'n': yylval.string_val[j++] = '\n'; i += 2; break; default: yylval.string_val[j++] << yytext[i + 1], i += 2; } yylval.string_val[j] = 0; return TOK_STRING; } - /* Dot (match all) */ + /* Dot (match all) */ . {return yylval.int_val = yytext[0];} %%%% // Here is pure C(++) #include int main(void) -{ +{ std::cout << "Hello, World\n"; return 0; -} +} diff --git a/autotests/folding/highlight.y.fold b/autotests/folding/highlight.y.fold index b29a900..4f6242b 100644 --- a/autotests/folding/highlight.y.fold +++ b/autotests/folding/highlight.y.fold @@ -1,93 +1,93 @@ /* Yacc / Bison hl test file. * It won't compile :-) Sure ! */ %{ #include using namespace std; extern KateParser *parser; %} %locations %union { int int_val; double double_val; bool bool_val; char *string_val; char *ident_val; struct var *v; void *ptr; } %token TOK_NOT_EQUAL "!=" %token TOK_LESSER_E "<=" %token TOK_GREATER_E ">=" %token TOK_EQUAL_2 "==" //comment %token PERCENT_DEBUG "%debug" PERCENT_DEFAULT_PREC "%default-prec" PERCENT_DEFINE "%define" ; %type type type_proc %code top { #define _GNU_SOURCE #include int val; } %destructor { free ($$); printf ("%d", @$.first_line); } <*> %lex-param {scanner_mode *mode}; %parse-param {int *nastiness} {int *randomness} %initial-action { @$.initialize (file_name); }; %%%% prog: KW_PROGRAM ident { parser->start($2); } prog_beg_glob_decl instructions { parser->endproc(0); } dev_procedures KW_ENDP ; number: integer_number | TOK_DOUBLE { $$ = new var; $$->type = KW_REEL; $$->cl = var::LITTERAL; $$->real = $1; }; words: %empty | words word ; %type word; %printer { fprintf (yyo, "%s", word_string ($$)); } ; word: %?{ boom(1); } | "hello" { $$ = hello; } | "bye" { $$ = bye; } ; foo: { $$ = 0 } | number { $$ = $1 | $2; } | hello { $$ = $1 | $3; } // without a comma hello: gram1 { $$ = "hi" }; | gram2 ;; %%%% #include int main(void) -{ +{ puts("Hello, World!"); return 0; -} +} diff --git a/autotests/folding/preprocessor-bug363280.cpp.fold b/autotests/folding/preprocessor-bug363280.cpp.fold index 3430631..f9aabcc 100644 --- a/autotests/folding/preprocessor-bug363280.cpp.fold +++ b/autotests/folding/preprocessor-bug363280.cpp.fold @@ -1,8 +1,8 @@ -#if 1 +#if 1 int x; // variable shall not be grey -#endif -#if defined (A) +#endif +#if defined (A) int y; // variable shall not be grey -#elif defined (B) +#elif defined (B)elif defined (B) int z; // variable shall not be grey -#endif +#endif diff --git a/autotests/html/folding.cpp.html b/autotests/html/folding.cpp.html index d20112c..a920612 100644 --- a/autotests/html/folding.cpp.html +++ b/autotests/html/folding.cpp.html @@ -1,22 +1,22 @@ folding.cpp
 /**
  * multi-line comment
  */
 
 /* comment */
 { { } {
 //BEGIN
 }
 //END
 }
 
 #if 0
-#elif 1
+#elif 1
 #else
 #endif
 
diff --git a/autotests/html/highlight.cpp.html b/autotests/html/highlight.cpp.html index bc32516..064bc08 100644 --- a/autotests/html/highlight.cpp.html +++ b/autotests/html/highlight.cpp.html @@ -1,303 +1,501 @@ highlight.cpp
 #pragma once
 
 #include <cassert>
 #include <assert.h>
 #include "assert.h"
-#include "assert.hpp"
+#include "assert.hpp" // abc
 #include "path/assert.hpp"
+#include "assert.h"a
+#include "assert.h" a
+#include <cassert>a
+#include <cassert> a
+#include FOO() error
+#include_next <cassert> a
+#include_next <cassert> /* a
+ */ b
+#include PATH_IN_MACRO
 #include PATH_IN_MACRO()
+#include PATH_IN_MACRO(a, b)
 
-#define SOME_VAR 1
+#define SOME_VAR 1
 #ifdef SOME_VAR
 
 #define MULTILINE_MACRO one \
 two \
 three
 
 # define MULTILINE_MACRO_TEXT                        \
-    /* NOTE The contents of macro is too green :D */ \
-    char const s[] = "a\\b"                          \
-    "c\nd"
+    /* NOTE The contents of macro is too green :D */ \
+    char const s[] = "a\\b"                          \
+    "c\nd"
+
+# define VARIADIC(a, ...)          \
+    f(a##a)                        \
+    f(__VA_ARGS__)                 \
+    f(#__VA_ARGS__)                \
+    f(__VA_ARGS__)                 \
+    f(0 __VA_OPT__(,) __VA_ARGS__) \
+    x __VA_OPT__(= { __VA_ARGS__ })
+
+# define MACRO() BAD \ ESCAPED
 
 # error dds
 # warning dds
 # line 2 "file.cpp"
-# define A(x, y) x##y x#y
+# define A(x, y) x##y x#y
 // OK(L, a) -> L"a"
-# define OK(x, y) x###y
-# define BAD(x, y) x####y
+# define OK(x, y) x###y
+# define BAD(x, y) x####y
+# define A /* multi line
+with comment */ expr
+# define A /* multi line
+with comment */
+23
+#else // x
+#42 // gcc extension = #line 42
+
+// error
+#wrong
+# wrong
+#endif x
+#if DS()
+#else x
+#else /* */x
+#else /* x
+y */ z
+#endif
 
 static int g_global;
 
 template<class T, typename U, template<class> class = std::is_pointer>
 struct class1
   : private std::vector<T>, public U
 {
     class1()
         try
         : _member1(xxx)
     {}
         catch(...)
     {}
 
+    class1(class1&&) = default;
+
     ~class1()
     {}
 
     void foo() { return; }
     void foo() const { return; }
     void foo() noexcept { return; }
     void foo() const noexcept { return; }
     virtual void foo() const noexcept { return; }
     static void foo() { return; }
     constexpr static void foo() const
         noexcept(noexcept(std::is_pointer<U>::value)) override
     {
         xxx::template ttt<U>::type {};
         xxx.template get<U>();
         xxx.std::rdbuf();
         auto x = C<'a'> + y;
     }
 
     int operator->*(T (C::*m)(int));
     operator value_t ();
 
 private:
 protected:
 public:
     value_type _member1; // NOTE internal ?
     value_type __internal;
     value_type internal__;
     value_type _M_internal;
     value_t member2_;
     value_type m_member3;
 
     static int s_static;
+    static constexpr int s_static;
+    static inline int s_static;
+    static inline constexpr int s_static;
 };
 
 constexpr struct : xyz
 {
     using xyz::xyz;
     using xyz::operator=;
 
     int a : 1;
     int b : 7;
 } x {};
 
 template<class T>
 using is_pointer = std::is_pointer<T>::type;
 
 template<class T>
 constexpr auto is_pointer_v = std::is_pointer<T>::value;
 
 uint64_t namespaces()
 {
     std::vector<T>;
     boost::vector<T>;
     detail::vector<T>;
     details::vector<T>;
     aux::vector<T>;
     internals::vector<T>;
     other::vector<T>;
 }
 
 #if 1
     double foo(const A);
-#else
+#else // else
     double foo(const A);
-#endif
+#endif // end
 
 #if 0
     double foo(const A);
-#else
+#else // else
     double foo(const A);
-#endif
+#endif // end
+
+#if 1
+    double foo(const A);
+#elif 1
+    double foo(const A);
+#elif 0
+    double foo(const A);
+#endif // end
+
+#if 0
+    double foo(const A);
+#elif 1
+    double foo(const A);
+#elif 0
+    double foo(const A);
+#endif // end
+
+#if 0
+    double foo(const A);
+#elif a
+    double foo(const A);
+#elif 0
+    double foo(const A);
+#elif a
+    double foo(const A);
+#else // else
+    double foo(const A);
+#endif // end
+
+#if 0 // blah blah
+    double foo(const A);
+#elif 1 // blah blah
+    double foo(const A);
+#else // else
+    double foo(const A);
+#endif // end
+
+#if 0 || a
+    double foo(const A);
+#else // else
+    double foo(const A);
+#endif // end
+
+#if 1 || a
+    double foo(const A);
+#else // else
+    double foo(const A);
+#endif // end
+
+#if 0 && a
+    double foo(const A);
+#else // else
+    double foo(const A);
+#endif // end
+
+#if 1 && a
+    double foo(const A);
+#else // else
+    double foo(const A);
+#endif // end
+
+#if a
+    double foo(const A);
+#elif 0
+    double foo(const A);
+#endif // end
+
+#if a
+    double foo(const A);
+#elif 1
+    double foo(const A);
+#endif // end
+
+#if a
+    double foo(const A);
+#elif a
+    double foo(const A);
+#endif // end
 
 int bar(void*p, void * pp)
 {
 # if 0
     double foo();
-# else
+# else // else
     double foo();
-# endif
+# endif // end
 }
 
-static uint64_t intWithSuffix = 42ull;
-static long intWithSuffixAndPrefix = 0b0101L;
+#if abc 0
+    double foo();
+#endif // end
+
+#if xxx
+    double foo();
+#else
+    double foo();
+#endif // end
+
+#if xxx
+    double foo();
+#elif xxx // elseif
+    double foo();
+#elif xxx // elseif
+    double foo();
+#endif // end
+
+// error
+#
+#d
+# d
+#if
+#elif
+#endif
+#ifndef
+#endif
+#ifdef 0
+#endif // end
+
+static uint64_t intWithSuffix = 42ull;
+static long intWithSuffixAndPrefix = 0b0101L;
 static int octNum = 07232;
 static int invalidOctNum = 09231;
 static uint64_t hexNum = 0xDEADBEEF42;
 static uint64_t invalidHexNum = 0xGLDFKG;
 static char binNum = 0b0101010;
 
-static int64_t intWithSuffix = -42LL;
-static long intWithSuffixAndPrefix = -0b0101L; // BUG
-static int octNum = -07232;
-static int invalidOctNum = -09231;
-static int64_t hexNum = -0xDEADBEEF42;
-static int64_t invalidHexNum = -0xGLDFKG;
-static char binNum = -0b0101010;
+static int64_t intWithSuffix = -42LL;
+static long intWithSuffixAndPrefix = -0b0101L;
+static int octNum = -07232;
+static int invalidOctNum = -09231;
+static int64_t hexNum = -0xDEADBEEF42;
+static int64_t invalidHexNum = -0xGLDFKG;
+static char binNum = -0b0101010;
 
-static uint64_t intWithSuffixWithSep = 4'2ull;
-static long intWithSuffixAndPrefixWithSep = 0b0'10'1L;
+static uint64_t intWithSuffixWithSep = 4'2ull;
+static long intWithSuffixAndPrefixWithSep = 0b0'10'1L;
 static int octNumWithSep = 07'232;
-static int invalidOctNumWithSep = 09'23'1;
+static int invalidOctNumWithSep = 09'23'1;
 static uint64_t hexNumWithSep = 0xD'EAD'BE'EF'42;
-static uint64_t invalidHexNumWithSep = 0xGLD'FKG;
+static uint64_t invalidHexNumWithSep = 0xGLD'FKG;
 static char binNumWithSep = 0b0'1010'10;
 
+static uint64_t invalidSep = 42'ull;
+static uint64_t invalidSep = 42';
+
 static double d1 = 42.;
 static double d2 = .42;
-static double d2a = -0.49;
-static double d2b = -0.09;
+static double d2a = -0.49;
+static double d2b = -0.09;
 static double d3 = 42.3e1;
 static double d4 = .2e-12;
 static double d5 = 32.e+12;
-static double invalidD1 = 32.e+a12;
-static float floatQualifier = 23.123f;
-// TODO c++17
-static double d6 = 0x1ffp10;
-static double d7 = 0X0p-1;
-static double d8 = 0x1.p0;
-static double d9 = 0xf.p-1;
-static double d10 = 0x0.123p-1;
-static double d11 = 0xa.bp10l;
-static double invalidD2 = 0x0.123p-a;
-static float floatQualifier = 0xf.p-1f;
+static double invalidD1 = 32.e+a12;
+static float floatQualifier = 23.123f;
+// Hexadecimal floating point (c++17)
+static double d6 = 0x1ffp10;
+static double d7 = 0X0p-1;
+static double d8 = 0x1.p0;
+static double d9 = 0xf.p-1L;
+static double d10 = 0x0.123p-1;
+static double d11 = 0xa.bp10l;
+static double invalidD2 = 0x0.123p-a;
+static float floatQualifier = 0xf.p-1f;
+
+60min; // c++17
+23._f
+23._fd
+2.3_f
+2.3_fd
+2._f
+2._fd
+2e4_f
+2e4_fd
+
+// error
+23.fd
+2e_fd
+2e
+1.y
+1.0_E+2.0
+1.0_E +2.0 // ok
+1_p+2
+1_p +2 // ok
+4s.count()
+4s. count()
+4s .count() // ok
 
 static bool yes = true;
 static bool no = false;
 
-
-static const char c1 = 'c';
-static const char       c1a = u8'c'; // TODO c++17
-static const char16_t   c1b = u'c';
-static const char32_t   c1c = U'c';
-static const wchar_t    c1d = L'c';
+// *char*
+static const char     c1 = 'c';
+static const char     c1a = u8'c'; // utf-8 char (c++17)
+static const char16_t c1b = u'c';
+static const char32_t c1c = U'c';
+static const wchar_t  c1d = L'c';
 static const char c2 = '\n';
 static const char c2a = '\120'; // octal
 static const char c2b = '\x1f'; // hex
 static const char c2c = '\'';
 static const char c2d = '\\';
+static const wchar_t c2e = L'\x1ff'; // hex
+static const wchar_t c2e = U'\x1fffffff'; // hex
+// error
+'\x123';
+'\u1234';
+'\U12345678';
+U'\u12345';
+u'\u123';
+U'\U1234567';
+U'\U123456789';
+U'\x123456789';
+
+// string
 static const char* c3 = "string";
 static const char* c4 = "\"string\n\t\012\x12\"";
 static const char* c5 = "multiline \
     string";
 static const char* c6 = "multifragment" "other""string";
 static const char*      c6a = u8"string";
 static const char16_t*  c6b = u"string";
 static const char32_t*  c6c = U"string";
 static const wchar_t*   c6d = L"string";
 static const char* rawString1 = R"(string)";
 static const char*      rawString1a = u8R"(string)";
 static const char16_t*  rawString1b = uR"(string)";
 static const char32_t*  rawString1c = UR"(string)";
 static const wchar_t*   rawString1d = LR"(string\nstring)";
 static const char* rawString2 = R"ab(string\nstring)ab";
 static const char* rawString3 = R"ab(string
 string)ab";
+" %d %df fd" U"ds %d" R"(a%d)";
+  "\x123xsk";
+ u"\x123xsk";
+// error
+u8"\x123xsk";
 
 // UDL (c++11)
 
-operator""_a(const char*); // BUG operator not colorized
-operator ""_a(const char*); // BUG colorized or
-operator "" _a(const char*); // BUG or not colorized
-operator "" a(const char*);
-operator ""a(const char*); // BUG
-operator""a(const char*); // BUG
+operator""_a(const char*);
+operator ""_a(const char*);
+operator "" _a(const char*);
+// invalid suffix
+operator "" a(const char*);
+operator ""a(const char*);
+operator""a(const char*);
 
-"string"_s; // BUG colorized or
-"string"s; // BUG or not colorized
-"string"_s-b; // -b is not part of the string
+"string"_s; // user
+"string"s; // standard
+"string"_s-b; // -b is not part of the string
 
 // Macro
 
 MY_XXX;
 BOOST_XXX;
 __STDC_VERSION__;
 __TIME__;
 __cplusplus;
 
 // Attributes
 
 [[noreturn]] void foo();
 [[deprecated]] void foo();
 [[deprecated("because")]] void foo();
 void foo([[carries_dependency]] int);
 
-[[opt(1), debug]]
-[[using CC: opt(1), debug]] // c++17
-[[using CC: CC::opt(1)]] // c++17
+[[opt(1), debug]]
+[[using CC: opt(1), debug]] // c++17
+[[using CC: CC::opt(1)]] // c++17
+
+[[gnu::assume_aligned(3'2l,2)]] void* f();
+[[using gnu: assume_aligned(3)]]
+[[clang::assume_aligned(3)]]
 
 void f([[maybe_unused]] int val)
 {
     [[maybe_unused]] int x;
     switch (x = foo(); x) {
         case 1:
             [[fallthrough]];
         case XXX:
         case Class::foo():
             [[fallthrough]];
         default:
             ;
     }
 
     // c++17: fold expression
     (args + ... + (1 * 2));
     (v.push_back(args), ...);
 
-    [[omp::parallel]] for (auto&& x : v)
+    [[omp::parallel]] for (auto&& x : v)
         x;
     for (auto&& [first,second] : mymap) {
     }
 
     auto [x, y] = foo();
 
     [x = 1, =y](){};
 
     decltype((auto)) x = foo();
 }
 
 auto f() -> decltype(foo());
 
 __attribute__((pure)) void f();
 
 label:
 goto label;
 
 
 //BEGIN region
 // TODO comment FIXME comment ### comment BUG comment
 //END region
 
-#wrong
-
 // \brief blah blah
 /// \brief blah blah
 
 /**
  * Doxygen
  * @param p1 text
  * \brief <b>bold text</b>
  * \dot
  * a -> b
  * \enddot
  *
  * \verbatim
  * <dummy>
  * \endverbatim
  * <html>text</html>
  */
 
 #endif
 
 // Some GNU macros, cross-referenced from gcc.xml to isocpp.xml
 __GCC_ATOMIC_CHAR16_T_LOCK_FREE
 __GNUC__
 __linux__
 
diff --git a/autotests/input/highlight.cpp b/autotests/input/highlight.cpp index de8c033..f09c0d6 100644 --- a/autotests/input/highlight.cpp +++ b/autotests/input/highlight.cpp @@ -1,296 +1,494 @@ #pragma once #include #include #include "assert.h" -#include "assert.hpp" +#include "assert.hpp" // abc #include "path/assert.hpp" +#include "assert.h"a +#include "assert.h" a +#include a +#include a +#include FOO() error +#include_next a +#include_next /* a + */ b +#include PATH_IN_MACRO #include PATH_IN_MACRO() +#include PATH_IN_MACRO(a, b) #define SOME_VAR 1 #ifdef SOME_VAR #define MULTILINE_MACRO one \ two \ three # define MULTILINE_MACRO_TEXT \ /* NOTE The contents of macro is too green :D */ \ char const s[] = "a\\b" \ "c\nd" +# define VARIADIC(a, ...) \ + f(a##a) \ + f(__VA_ARGS__) \ + f(#__VA_ARGS__) \ + f(__VA_ARGS__) \ + f(0 __VA_OPT__(,) __VA_ARGS__) \ + x __VA_OPT__(= { __VA_ARGS__ }) + +# define MACRO() BAD \ ESCAPED + # error dds # warning dds # line 2 "file.cpp" # define A(x, y) x##y x#y // OK(L, a) -> L"a" # define OK(x, y) x###y # define BAD(x, y) x####y +# define A /* multi line +with comment */ expr +# define A /* multi line +with comment */ +23 +#else // x +#42 // gcc extension = #line 42 + +// error +#wrong +# wrong +#endif x +#if DS() +#else x +#else /* */x +#else /* x +y */ z +#endif static int g_global; template class = std::is_pointer> struct class1 : private std::vector, public U { class1() try : _member1(xxx) {} catch(...) {} + class1(class1&&) = default; + ~class1() {} void foo() { return; } void foo() const { return; } void foo() noexcept { return; } void foo() const noexcept { return; } virtual void foo() const noexcept { return; } static void foo() { return; } constexpr static void foo() const noexcept(noexcept(std::is_pointer::value)) override { xxx::template ttt::type {}; xxx.template get(); xxx.std::rdbuf(); auto x = C<'a'> + y; } int operator->*(T (C::*m)(int)); operator value_t (); private: protected: public: value_type _member1; // NOTE internal ? value_type __internal; value_type internal__; value_type _M_internal; value_t member2_; value_type m_member3; static int s_static; + static constexpr int s_static; + static inline int s_static; + static inline constexpr int s_static; }; constexpr struct : xyz { using xyz::xyz; using xyz::operator=; int a : 1; int b : 7; } x {}; template using is_pointer = std::is_pointer::type; template constexpr auto is_pointer_v = std::is_pointer::value; uint64_t namespaces() { std::vector; boost::vector; detail::vector; details::vector; aux::vector; internals::vector; other::vector; } #if 1 double foo(const A); -#else +#else // else double foo(const A); -#endif +#endif // end #if 0 double foo(const A); -#else +#else // else double foo(const A); -#endif +#endif // end + +#if 1 + double foo(const A); +#elif 1 + double foo(const A); +#elif 0 + double foo(const A); +#endif // end + +#if 0 + double foo(const A); +#elif 1 + double foo(const A); +#elif 0 + double foo(const A); +#endif // end + +#if 0 + double foo(const A); +#elif a + double foo(const A); +#elif 0 + double foo(const A); +#elif a + double foo(const A); +#else // else + double foo(const A); +#endif // end + +#if 0 // blah blah + double foo(const A); +#elif 1 // blah blah + double foo(const A); +#else // else + double foo(const A); +#endif // end + +#if 0 || a + double foo(const A); +#else // else + double foo(const A); +#endif // end + +#if 1 || a + double foo(const A); +#else // else + double foo(const A); +#endif // end + +#if 0 && a + double foo(const A); +#else // else + double foo(const A); +#endif // end + +#if 1 && a + double foo(const A); +#else // else + double foo(const A); +#endif // end + +#if a + double foo(const A); +#elif 0 + double foo(const A); +#endif // end + +#if a + double foo(const A); +#elif 1 + double foo(const A); +#endif // end + +#if a + double foo(const A); +#elif a + double foo(const A); +#endif // end int bar(void*p, void * pp) { # if 0 double foo(); -# else +# else // else double foo(); -# endif +# endif // end } +#if abc 0 + double foo(); +#endif // end + +#if xxx + double foo(); +#else + double foo(); +#endif // end + +#if xxx + double foo(); +#elif xxx // elseif + double foo(); +#elif xxx // elseif + double foo(); +#endif // end + +// error +# +#d +# d +#if +#elif +#endif +#ifndef +#endif +#ifdef 0 +#endif // end + static uint64_t intWithSuffix = 42ull; static long intWithSuffixAndPrefix = 0b0101L; static int octNum = 07232; static int invalidOctNum = 09231; static uint64_t hexNum = 0xDEADBEEF42; static uint64_t invalidHexNum = 0xGLDFKG; static char binNum = 0b0101010; static int64_t intWithSuffix = -42LL; -static long intWithSuffixAndPrefix = -0b0101L; // BUG +static long intWithSuffixAndPrefix = -0b0101L; static int octNum = -07232; static int invalidOctNum = -09231; static int64_t hexNum = -0xDEADBEEF42; static int64_t invalidHexNum = -0xGLDFKG; static char binNum = -0b0101010; static uint64_t intWithSuffixWithSep = 4'2ull; static long intWithSuffixAndPrefixWithSep = 0b0'10'1L; static int octNumWithSep = 07'232; static int invalidOctNumWithSep = 09'23'1; static uint64_t hexNumWithSep = 0xD'EAD'BE'EF'42; static uint64_t invalidHexNumWithSep = 0xGLD'FKG; static char binNumWithSep = 0b0'1010'10; +static uint64_t invalidSep = 42'ull; +static uint64_t invalidSep = 42'; + static double d1 = 42.; static double d2 = .42; static double d2a = -0.49; static double d2b = -0.09; static double d3 = 42.3e1; static double d4 = .2e-12; static double d5 = 32.e+12; static double invalidD1 = 32.e+a12; static float floatQualifier = 23.123f; -// TODO c++17 +// Hexadecimal floating point (c++17) static double d6 = 0x1ffp10; static double d7 = 0X0p-1; static double d8 = 0x1.p0; -static double d9 = 0xf.p-1; +static double d9 = 0xf.p-1L; static double d10 = 0x0.123p-1; static double d11 = 0xa.bp10l; static double invalidD2 = 0x0.123p-a; static float floatQualifier = 0xf.p-1f; +60min; // c++17 +23._f +23._fd +2.3_f +2.3_fd +2._f +2._fd +2e4_f +2e4_fd + +// error +23.fd +2e_fd +2e +1.y +1.0_E+2.0 +1.0_E +2.0 // ok +1_p+2 +1_p +2 // ok +4s.count() +4s. count() +4s .count() // ok + static bool yes = true; static bool no = false; - -static const char c1 = 'c'; -static const char c1a = u8'c'; // TODO c++17 -static const char16_t c1b = u'c'; -static const char32_t c1c = U'c'; -static const wchar_t c1d = L'c'; +// *char* +static const char c1 = 'c'; +static const char c1a = u8'c'; // utf-8 char (c++17) +static const char16_t c1b = u'c'; +static const char32_t c1c = U'c'; +static const wchar_t c1d = L'c'; static const char c2 = '\n'; static const char c2a = '\120'; // octal static const char c2b = '\x1f'; // hex static const char c2c = '\''; static const char c2d = '\\'; +static const wchar_t c2e = L'\x1ff'; // hex +static const wchar_t c2e = U'\x1fffffff'; // hex +// error +'\x123'; +'\u1234'; +'\U12345678'; +U'\u12345'; +u'\u123'; +U'\U1234567'; +U'\U123456789'; +U'\x123456789'; + +// string static const char* c3 = "string"; static const char* c4 = "\"string\n\t\012\x12\""; static const char* c5 = "multiline \ string"; static const char* c6 = "multifragment" "other""string"; static const char* c6a = u8"string"; static const char16_t* c6b = u"string"; static const char32_t* c6c = U"string"; static const wchar_t* c6d = L"string"; static const char* rawString1 = R"(string)"; static const char* rawString1a = u8R"(string)"; static const char16_t* rawString1b = uR"(string)"; static const char32_t* rawString1c = UR"(string)"; static const wchar_t* rawString1d = LR"(string\nstring)"; static const char* rawString2 = R"ab(string\nstring)ab"; static const char* rawString3 = R"ab(string string)ab"; +" %d %df fd" U"ds %d" R"(a%d)"; + "\x123xsk"; + u"\x123xsk"; +// error +u8"\x123xsk"; // UDL (c++11) -operator""_a(const char*); // BUG operator not colorized -operator ""_a(const char*); // BUG colorized or -operator "" _a(const char*); // BUG or not colorized +operator""_a(const char*); +operator ""_a(const char*); +operator "" _a(const char*); +// invalid suffix operator "" a(const char*); -operator ""a(const char*); // BUG -operator""a(const char*); // BUG +operator ""a(const char*); +operator""a(const char*); -"string"_s; // BUG colorized or -"string"s; // BUG or not colorized +"string"_s; // user +"string"s; // standard "string"_s-b; // -b is not part of the string // Macro MY_XXX; BOOST_XXX; __STDC_VERSION__; __TIME__; __cplusplus; // Attributes [[noreturn]] void foo(); [[deprecated]] void foo(); [[deprecated("because")]] void foo(); void foo([[carries_dependency]] int); [[opt(1), debug]] [[using CC: opt(1), debug]] // c++17 [[using CC: CC::opt(1)]] // c++17 +[[gnu::assume_aligned(3'2l,2)]] void* f(); +[[using gnu: assume_aligned(3)]] +[[clang::assume_aligned(3)]] + void f([[maybe_unused]] int val) { [[maybe_unused]] int x; switch (x = foo(); x) { case 1: [[fallthrough]]; case XXX: case Class::foo(): [[fallthrough]]; default: ; } // c++17: fold expression (args + ... + (1 * 2)); (v.push_back(args), ...); [[omp::parallel]] for (auto&& x : v) x; for (auto&& [first,second] : mymap) { } auto [x, y] = foo(); [x = 1, =y](){}; decltype((auto)) x = foo(); } auto f() -> decltype(foo()); __attribute__((pure)) void f(); label: goto label; //BEGIN region // TODO comment FIXME comment ### comment BUG comment //END region -#wrong - // \brief blah blah /// \brief blah blah /** * Doxygen * @param p1 text * \brief bold text * \dot * a -> b * \enddot * * \verbatim * * \endverbatim * text */ #endif // Some GNU macros, cross-referenced from gcc.xml to isocpp.xml __GCC_ATOMIC_CHAR16_T_LOCK_FREE __GNUC__ __linux__ diff --git a/autotests/reference/folding.cpp.ref b/autotests/reference/folding.cpp.ref index bb11920..1152f0d 100644 --- a/autotests/reference/folding.cpp.ref +++ b/autotests/reference/folding.cpp.ref @@ -1,15 +1,15 @@ /**
* multi-line comment
*/

/* comment */
{ { } {
//BEGIN
}
//END
}

#if 0
-#elif 1
+#elif 1
#else
#endif
diff --git a/autotests/reference/highlight.cpp.ref b/autotests/reference/highlight.cpp.ref index 575a81c..484cde2 100644 --- a/autotests/reference/highlight.cpp.ref +++ b/autotests/reference/highlight.cpp.ref @@ -1,296 +1,494 @@ #pragma once

#include
#include
#include "assert.h"
-#include "assert.hpp"
+#include "assert.hpp" // abc
#include "path/assert.hpp"
+#include "assert.h"a
+#include "assert.h" a
+#include a
+#include a
+#include FOO() error
+#include_next a
+#include_next /* a
+ */ b
+#include PATH_IN_MACRO
#include PATH_IN_MACRO()
+#include PATH_IN_MACRO(a, b)

-#define SOME_VAR 1
+#define SOME_VAR 1
#ifdef SOME_VAR

#define MULTILINE_MACRO one \
two \
three

# define MULTILINE_MACRO_TEXT \
- /* NOTE The contents of macro is too green :D */ \
- char const s[] = "a\\b" \
- "c\nd"
+ /* NOTE The contents of macro is too green :D */ \
+ char const s[] = "a\\b" \
+ "c\nd"
+
+# define VARIADIC(a, ...) \
+ f(a##a) \
+ f(__VA_ARGS__) \
+ f(#__VA_ARGS__) \
+ f(__VA_ARGS__) \
+ f(0 __VA_OPT__(,) __VA_ARGS__) \
+ x __VA_OPT__(= { __VA_ARGS__ })
+
+# define MACRO() BAD \ ESCAPED

# error dds
# warning dds
# line 2 "file.cpp"
-# define A(x, y) x##y x#y
+# define A(x, y) x##y x#y
// OK(L, a) -> L"a"
-# define OK(x, y) x###y
-# define BAD(x, y) x####y
+# define OK(x, y) x###y
+# define BAD(x, y) x####y
+# define A /* multi line
+with comment */ expr
+# define A /* multi line
+with comment */
+23
+#else // x
+#42 // gcc extension = #line 42
+
+// error
+#wrong
+# wrong
+#endif x
+#if DS()
+#else x
+#else /* */x
+#else /* x
+y */ z
+#endif

static int g_global;

template<class T, typename U, template<class> class = std::is_pointer>
struct class1
: private std::vector<T>, public U
{
class1()
try
: _member1(xxx)
{}
catch(...)
{}

+ class1(class1&&) = default;
+
~class1()
{}

void foo() { return; }
void foo() const { return; }
void foo() noexcept { return; }
void foo() const noexcept { return; }
virtual void foo() const noexcept { return; }
static void foo() { return; }
constexpr static void foo() const
noexcept(noexcept(std::is_pointer<U>::value)) override
{
xxx::template ttt<U>::type {};
xxx.template get<U>();
xxx.std::rdbuf();
auto x = C<'a'> + y;
}

int operator->*(T (C::*m)(int));
operator value_t ();

private:
protected:
public:
value_type _member1; // NOTE internal ?
value_type __internal;
value_type internal__;
value_type _M_internal;
value_t member2_;
value_type m_member3;

static int s_static;
+ static constexpr int s_static;
+ static inline int s_static;
+ static inline constexpr int s_static;
};

constexpr struct : xyz
{
using xyz::xyz;
using xyz::operator=;

int a : 1;
int b : 7;
} x {};

template<class T>
using is_pointer = std::is_pointer<T>::type;

template<class T>
constexpr auto is_pointer_v = std::is_pointer<T>::value;

uint64_t namespaces()
{
std::vector<T>;
boost::vector<T>;
detail::vector<T>;
details::vector<T>;
aux::vector<T>;
internals::vector<T>;
other::vector<T>;
}

#if 1
double foo(const A);
-#else
+#else // else
double foo(const A);
-#endif
+#endif // end

#if 0
double foo(const A);
-#else
+#else // else
double foo(const A);
-#endif
+#endif // end
+
+#if 1
+ double foo(const A);
+#elif 1
+ double foo(const A);
+#elif 0
+ double foo(const A);
+#endif // end
+
+#if 0
+ double foo(const A);
+#elif 1
+ double foo(const A);
+#elif 0
+ double foo(const A);
+#endif // end
+
+#if 0
+ double foo(const A);
+#elif a
+ double foo(const A);
+#elif 0
+ double foo(const A);
+#elif a
+ double foo(const A);
+#else // else
+ double foo(const A);
+#endif // end
+
+#if 0 // blah blah
+ double foo(const A);
+#elif 1 // blah blah
+ double foo(const A);
+#else // else
+ double foo(const A);
+#endif // end
+
+#if 0 || a
+ double foo(const A);
+#else // else
+ double foo(const A);
+#endif // end
+
+#if 1 || a
+ double foo(const A);
+#else // else
+ double foo(const A);
+#endif // end
+
+#if 0 && a
+ double foo(const A);
+#else // else
+ double foo(const A);
+#endif // end
+
+#if 1 && a
+ double foo(const A);
+#else // else
+ double foo(const A);
+#endif // end
+
+#if a
+ double foo(const A);
+#elif 0
+ double foo(const A);
+#endif // end
+
+#if a
+ double foo(const A);
+#elif 1
+ double foo(const A);
+#endif // end
+
+#if a
+ double foo(const A);
+#elif a
+ double foo(const A);
+#endif // end

int bar(void*p, void * pp)
{
# if 0
double foo();
-# else
+# else // else
double foo();
-# endif
+# endif // end
}

-static uint64_t intWithSuffix = 42ull;
-static long intWithSuffixAndPrefix = 0b0101L;
+#if abc 0
+ double foo();
+#endif // end
+
+#if xxx
+ double foo();
+#else
+ double foo();
+#endif // end
+
+#if xxx
+ double foo();
+#elif xxx // elseif
+ double foo();
+#elif xxx // elseif
+ double foo();
+#endif // end
+
+// error
+#
+#d
+# d
+#if
+#elif
+#endif
+#ifndef
+#endif
+#ifdef 0
+#endif // end
+
+static uint64_t intWithSuffix = 42ull;
+static long intWithSuffixAndPrefix = 0b0101L;
static int octNum = 07232;
static int invalidOctNum = 09231;
static uint64_t hexNum = 0xDEADBEEF42;
static uint64_t invalidHexNum = 0xGLDFKG;
static char binNum = 0b0101010;

-static int64_t intWithSuffix = -42LL;
-static long intWithSuffixAndPrefix = -0b0101L; // BUG
-static int octNum = -07232;
-static int invalidOctNum = -09231;
-static int64_t hexNum = -0xDEADBEEF42;
-static int64_t invalidHexNum = -0xGLDFKG;
-static char binNum = -0b0101010;
+static int64_t intWithSuffix = -42LL;
+static long intWithSuffixAndPrefix = -0b0101L;
+static int octNum = -07232;
+static int invalidOctNum = -09231;
+static int64_t hexNum = -0xDEADBEEF42;
+static int64_t invalidHexNum = -0xGLDFKG;
+static char binNum = -0b0101010;

-static uint64_t intWithSuffixWithSep = 4'2ull;
-static long intWithSuffixAndPrefixWithSep = 0b0'10'1L;
+static uint64_t intWithSuffixWithSep = 4'2ull;
+static long intWithSuffixAndPrefixWithSep = 0b0'10'1L;
static int octNumWithSep = 07'232;
-static int invalidOctNumWithSep = 09'23'1;
+static int invalidOctNumWithSep = 09'23'1;
static uint64_t hexNumWithSep = 0xD'EAD'BE'EF'42;
-static uint64_t invalidHexNumWithSep = 0xGLD'FKG;
+static uint64_t invalidHexNumWithSep = 0xGLD'FKG;
static char binNumWithSep = 0b0'1010'10;

+static uint64_t invalidSep = 42'ull;
+static uint64_t invalidSep = 42';
+
static double d1 = 42.;
static double d2 = .42;
-static double d2a = -0.49;
-static double d2b = -0.09;
+static double d2a = -0.49;
+static double d2b = -0.09;
static double d3 = 42.3e1;
static double d4 = .2e-12;
static double d5 = 32.e+12;
-static double invalidD1 = 32.e+a12;
-static float floatQualifier = 23.123f;
-// TODO c++17
-static double d6 = 0x1ffp10;
-static double d7 = 0X0p-1;
-static double d8 = 0x1.p0;
-static double d9 = 0xf.p-1;
-static double d10 = 0x0.123p-1;
-static double d11 = 0xa.bp10l;
-static double invalidD2 = 0x0.123p-a;
-static float floatQualifier = 0xf.p-1f;
+static double invalidD1 = 32.e+a12;
+static float floatQualifier = 23.123f;
+// Hexadecimal floating point (c++17)
+static double d6 = 0x1ffp10;
+static double d7 = 0X0p-1;
+static double d8 = 0x1.p0;
+static double d9 = 0xf.p-1L;
+static double d10 = 0x0.123p-1;
+static double d11 = 0xa.bp10l;
+static double invalidD2 = 0x0.123p-a;
+static float floatQualifier = 0xf.p-1f;
+
+60min; // c++17
+23._f
+23._fd
+2.3_f
+2.3_fd
+2._f
+2._fd
+2e4_f
+2e4_fd
+
+// error
+23.fd
+2e_fd
+2e
+1.y
+1.0_E+2.0
+1.0_E +2.0 // ok
+1_p+2
+1_p +2 // ok
+4s.count()
+4s. count()
+4s .count() // ok

static bool yes = true;
static bool no = false;

-
-static const char c1 = 'c';
-static const char c1a = u8'c'; // TODO c++17
-static const char16_t c1b = u'c';
-static const char32_t c1c = U'c';
-static const wchar_t c1d = L'c';
+// *char*
+static const char c1 = 'c';
+static const char c1a = u8'c'; // utf-8 char (c++17)
+static const char16_t c1b = u'c';
+static const char32_t c1c = U'c';
+static const wchar_t c1d = L'c';
static const char c2 = '\n';
static const char c2a = '\120'; // octal
static const char c2b = '\x1f'; // hex
static const char c2c = '\'';
static const char c2d = '\\';
+static const wchar_t c2e = L'\x1ff'; // hex
+static const wchar_t c2e = U'\x1fffffff'; // hex
+// error
+'\x123';
+'\u1234';
+'\U12345678';
+U'\u12345';
+u'\u123';
+U'\U1234567';
+U'\U123456789';
+U'\x123456789';
+
+// string
static const char* c3 = "string";
static const char* c4 = "\"string\n\t\012\x12\"";
static const char* c5 = "multiline \
string";
static const char* c6 = "multifragment" "other""string";
static const char* c6a = u8"string";
static const char16_t* c6b = u"string";
static const char32_t* c6c = U"string";
static const wchar_t* c6d = L"string";
static const char* rawString1 = R"(string)";
static const char* rawString1a = u8R"(string)";
static const char16_t* rawString1b = uR"(string)";
static const char32_t* rawString1c = UR"(string)";
static const wchar_t* rawString1d = LR"(string\nstring)";
static const char* rawString2 = R"ab(string\nstring)ab";
static const char* rawString3 = R"ab(string
string)ab";
+" %d %df fd" U"ds %d" R"(a%d)";
+ "\x123xsk";
+ u"\x123xsk";
+// error
+u8"\x123xsk";

// UDL (c++11)

-operator""_a(const char*); // BUG operator not colorized
-operator ""_a(const char*); // BUG colorized or
-operator "" _a(const char*); // BUG or not colorized
-operator "" a(const char*);
-operator ""a(const char*); // BUG
-operator""a(const char*); // BUG
+operator""_a(const char*);
+operator ""_a(const char*);
+operator "" _a(const char*);
+// invalid suffix
+operator "" a(const char*);
+operator ""a(const char*);
+operator""a(const char*);

-"string"_s; // BUG colorized or
-"string"s; // BUG or not colorized
-"string"_s-b; // -b is not part of the string
+"string"_s; // user
+"string"s; // standard
+"string"_s-b; // -b is not part of the string

// Macro

MY_XXX;
BOOST_XXX;
__STDC_VERSION__;
__TIME__;
__cplusplus;

// Attributes

[[noreturn]] void foo();
[[deprecated]] void foo();
[[deprecated("because")]] void foo();
void foo([[carries_dependency]] int);

-[[opt(1), debug]]
-[[using CC: opt(1), debug]] // c++17
-[[using CC: CC::opt(1)]] // c++17
+[[opt(1), debug]]
+[[using CC: opt(1), debug]] // c++17
+[[using CC: CC::opt(1)]] // c++17

-void f([[maybe_unused]] int val)
+[[gnu::assume_aligned(3'2l,2)]] void* f();
+[[using gnu: assume_aligned(3)]]
+[[clang::assume_aligned(3)]]
+
+void f([[maybe_unused]] int val)
{
- [[maybe_unused]] int x;
+ [[maybe_unused]] int x;
switch (x = foo(); x) {
case 1:
- [[fallthrough]];
+ [[fallthrough]];
case XXX:
case Class::foo():
- [[fallthrough]];
+ [[fallthrough]];
default:
;
}

// c++17: fold expression
(args + ... + (1 * 2));
(v.push_back(args), ...);

- [[omp::parallel]] for (auto&& x : v)
+ [[omp::parallel]] for (auto&& x : v)
x;
for (auto&& [first,second] : mymap) {
}

auto [x, y] = foo();

[x = 1, =y](){};

decltype((auto)) x = foo();
}

auto f() -> decltype(foo());

__attribute__((pure)) void f();

label:
goto label;


//BEGIN region
// TODO comment FIXME comment ### comment BUG comment
//END region

-#wrong
-
// \brief blah blah
/// \brief blah blah

/**
* Doxygen
* @param p1 text
* \brief bold text
* \dot
* a -> b
* \enddot
*
* \verbatim
*
* \endverbatim
* text
*/

#endif

// Some GNU macros, cross-referenced from gcc.xml to isocpp.xml
__GCC_ATOMIC_CHAR16_T_LOCK_FREE
__GNUC__
__linux__
diff --git a/data/syntax/gcc.xml b/data/syntax/gcc.xml index 986c1b4..258686d 100644 --- a/data/syntax/gcc.xml +++ b/data/syntax/gcc.xml @@ -1,581 +1,610 @@ ]> diff --git a/data/syntax/isocpp.xml b/data/syntax/isocpp.xml index e0d2766..60894ed 100644 --- a/data/syntax/isocpp.xml +++ b/data/syntax/isocpp.xml @@ -1,515 +1,822 @@ - - + + + + + + + + - + + + + + + + ]> break case catch continue default do else for goto if return switch throw try while alignof alignas asm auto class + concept + requires constexpr const_cast decltype delete dynamic_cast enum explicit export false final friend inline namespace new noexcept nullptr operator override private protected public reinterpret_cast sizeof static_assert static_cast struct template this true typedef typeid typename union using virtual and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq + + + + + + template + noreturn carries_dependency - + deprecated + + fallthrough + nodiscard + maybe_unused + + likely + unlikely + no_unique_address + + + + + + using bool char char16_t char32_t double float int long short signed unsigned void int8_t int16_t int32_t int64_t uint8_t uint16_t uint32_t uint64_t int_least8_t int_least16_t int_least32_t int_least64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t size_t ssize_t wchar_t intptr_t uintptr_t intmax_t uintmax_t ptrdiff_t sig_atomic_t wint_t va_list FILE fpos_t time_t const extern mutable register static thread_local volatile + + __DATE__ __FILE__ __LINE__ - __DATE__ - __TIME__ - __STDC__ - __STDC_VERSION__ + __STDCPP_DEFAULT_NEW_ALIGNMENT__ + __STDCPP_STRICT_POINTER_SAFETY__ + __STDCPP_THREADS__ __STDC_HOSTED__ __STDC_ISO_10646__ __STDC_MB_MIGHT_NEQ_WC__ + __STDC_VERSION__ + __STDC__ + __TIME__ __cplusplus __func__ + assert + _Pragma + __has_include + + + __VA_ARGS__ + __VA_OPT__ + + + if + + + ifdef + ifndef + + + elif + + + else + + + endif + + + cmakedefine01 + cmakedefine + define + + + include + + + error + line + pragma + undef + warning - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + - - - - - - + + + + - - - - - + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + - - + + + + - + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + - + - - - + + + + + + + + + + + + + + - + + - + + - + + - + - - + + + - - - - - - - + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + - - + + + + + + + + + + - + - - - + + + + + + + - - - - - + + + + + + - + - - + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - - - + + + - + - + + + + - +