Package: cc-mode;
Reported by: Zhiwei Chen <condy0919 <at> gmail.com>
Date: Sat, 2 Jul 2022 19:13:01 UTC
Severity: normal
Done: Alan Mackenzie <acm <at> muc.de>
Bug is archived. No further changes may be made.
Message #13 received at 56362-done <at> debbugs.gnu.org (full text, mbox):
From: Alan Mackenzie <acm <at> muc.de> To: Zhiwei Chen <condy0919 <at> gmail.com> Cc: 56362-done <at> debbugs.gnu.org, acm <at> muc.de Subject: Re: bug#56362: CC Mode 5.35.1 (C++//l); Highlight for C++20 keywords Date: Tue, 4 Oct 2022 17:32:40 +0000
Hello again, Zhiwei. I've now committed the changes to standalone CC Mode and the Emacs master branch. As a matter of interest, I've also committed support for C++20 concepts and modules. I'm closing the bug with this post. -- Alan Mackenzie (Nuremberg, Germany). On Wed, Sep 07, 2022 at 13:01:24 +0000, Alan Mackenzie wrote: > Hello, Zhiwei. > First of all, sorry that it's taken me two months to reply. > Secondly, thanks for taking the trouble to submit this bug. I have fixed > the problems, partly, but I still have a lot of work to do to bring CC > Mode up to the C++20 standard. In particular, "concepts" and "requires" > will need a lot doing. I hope to do this work in the coming weeks. > I have included a patch for these problems below; could you please test > this patch on your CC Mode and your real C++ source files, and let me > know how it goes. As I said, it is not perfect, but it should be better > than it was. If you want any help with the patching or byte compiling of > CC Mode, feel free to send me private email. > For the problems you raised: > On Sun, Jul 03, 2022 at 03:12:28 +0800, Zhiwei Chen wrote: > > Package: cc-mode > > See the comments. > > #+begin_src C++ > > #if __has_include(<bits/stdc++.h>) > > #include <bits/stdc++.h> > > #endif > > #include <cstdint> > > #include <concepts> > > // no highlight for consteval keyword > > consteval int sqr(int x) { > > return x * x; > > } > Now fixed. > > // no highlight for constinit keyword > > constinit int four = sqr(16); > Now fixed. > > class Foo { > > public: > > // <=> highlights wrong > > auto operator<=>(const Foo&) const = default; > Now fixed. > > private: > > // no highlight for alignas keyword > > alignas(alignof(std::uint64_t)) int val_; > > }; > Now fixed. It's also worth noting that "alignas" in a struct/class: > class alignas(64) Foo { ..... } > should now fontify correctly. > > template <typename T> > > requires std::integral<T> // 'requires' occasionally has a font-lock-type-face > > T add(T a, T b) { > > return a + b; > > } > Here's where I still need to make "requires" work properly. I've > temporarily make "requires" and "concept" C++ keywords, but in the above > piece of code, "T add(T a, T b) {" is not correctly fontified. But > "requires" should now always be fontified as a keyword. > > int main() { > > const char8_t c1 = 0; // char8_t is missing in `c-primitive-type-kwds'. cc-langs.el L2205 > > return 0; > > } > > #+end_src > char8_t is now in c-primitive-type-kwds. > > Emacs : GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6) > > of 2022-07-02 > > Package: CC Mode 5.35.1 (C++//l) > > Buffer Style: gnu > > c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit) > [ CC Mode configuration appreciated, but snipped ] > Here's the patch: > diff -r 87af98f62eec cc-langs.el > --- a/cc-langs.el Wed Aug 31 18:28:12 2022 +0000 > +++ b/cc-langs.el Wed Sep 07 12:38:20 2022 +0000 > @@ -1301,6 +1301,10 @@ > ,@(when (c-major-mode-is 'java-mode) > '(">>>"))) > + ;; The C++ "spaceship" operator. > + ,@(when (c-major-mode-is 'c++-mode) > + `((left-assoc "<=>"))) > + > ;; Relational. > (left-assoc "<" ">" "<=" ">=" > ,@(when (c-major-mode-is 'java-mode) > @@ -1414,7 +1418,7 @@ > "^" "??'" "xor" "&" "bitand" "|" "??!" "bitor" "~" "??-" "compl" > "!" "=" "<" ">" "+=" "-=" "*=" "/=" "%=" "^=" > "??'=" "xor_eq" "&=" "and_eq" "|=" "??!=" "or_eq" > - "<<" ">>" ">>=" "<<=" "==" "!=" "not_eq" "<=" ">=" > + "<<" ">>" ">>=" "<<=" "==" "!=" "not_eq" "<=>" "<=" ">=" > "&&" "and" "||" "??!??!" "or" "++" "--" "," "->*" "->" > "()" "[]" "<::>" "??(??)") > ;; These work like identifiers in Pike. > @@ -1535,8 +1539,10 @@ > "List of all arithmetic operators, including \"+=\", etc." > ;; Note: in the following, there are too many operators for AWK and IDL. > t (append (c-lang-const c-assignment-operators) > - '("+" "-" "*" "/" "%" > + `("+" "-" "*" "/" "%" > "<<" ">>" > + ,@(if (c-major-mode-is 'c++-mode) > + '("<=>")) > "<" ">" "<=" ">=" > "==" "!=" > "&" "^" "|" > @@ -2187,7 +2193,7 @@ > '("_Bool" "_Complex" "_Imaginary") ; Conditionally defined in C99. > (c-lang-const c-primitive-type-kwds)) > c++ (append > - '("bool" "wchar_t" "char16_t" "char32_t") > + '("bool" "wchar_t" "char8_t" "char16_t" "char32_t") > (c-lang-const c-primitive-type-kwds)) > ;; Objective-C extends C, but probably not the new stuff in C99. > objc (append > @@ -2580,8 +2586,8 @@ > t nil > (c c++) '("extern" "inline" "register" "static") > c (append '("auto") (c-lang-const c-modifier-kwds)) > - c++ (append '("constexpr" "explicit" "friend" "mutable" "template" > - "thread_local" "virtual") > + c++ (append '("consteval" "constexpr" "constinit" "explicit" "friend" > + "mutable" "template" "thread_local" "virtual") > ;; "using" is now handled specially (2020-09-14). > (c-lang-const c-modifier-kwds)) > objc '("auto" "bycopy" "byref" "extern" "in" "inout" "oneway" "out" "static") > @@ -2655,7 +2661,8 @@ > (c c++) '(;; GCC extension. > "__attribute__" > ;; MSVC extension. > - "__declspec")) > + "__declspec") > + c++ (append (c-lang-const c-decl-hangon-kwds) '("alignas"))) > (c-lang-defconst c-decl-hangon-key > ;; Adorned regexp matching `c-decl-hangon-kwds'. > @@ -2880,7 +2887,7 @@ > "__attribute__" > ;; MSVC extension. > "__declspec") > - c++ (append (c-lang-const c-paren-nontype-kwds) '("noexcept"))) > + c++ (append (c-lang-const c-paren-nontype-kwds) '("noexcept" "alignas"))) > (c-lang-defconst c-paren-nontype-key > t (c-make-keywords-re t (c-lang-const c-paren-nontype-kwds))) > @@ -3256,11 +3263,17 @@ > (c-lang-defconst c-keywords > ;; All keywords as a list. > t (c--delete-duplicates > - (c-lang-defconst-eval-immediately > - `(append ,@(mapcar (lambda (kwds-lang-const) > - `(c-lang-const ,kwds-lang-const)) > - c-kwds-lang-consts) > - nil)) > + (append ; Temporary, 2022-09-07 > + (c-lang-defconst-eval-immediately > + `(append ,@(mapcar (lambda (kwds-lang-const) > + `(c-lang-const ,kwds-lang-const)) > + c-kwds-lang-consts) > + nil)) > + ;; Temporary addition for C++ until concepts have been worked out properly. > + ;; 2022-09-07. > + `(,@(if (c-major-mode-is 'c++-mode) > + '("concept" "requires"))) > + nil) > :test 'string-equal)) > (c-lang-defconst c-keywords-regexp > -- > Alan Mackenzie (Nuremberg, Germany).
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.