runtime(c): add new constexpr keyword to syntax file (C23)

closes: #16471

Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/c.vim b/runtime/syntax/c.vim
index eb56239..68b6778 100644
--- a/runtime/syntax/c.vim
+++ b/runtime/syntax/c.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:		C
 " Maintainer:		The Vim Project <https://github.com/vim/vim>
-" Last Change:		2025 Jan 15
+" Last Change:		2025 Jan 18
 " Former Maintainer:	Bram Moolenaar <Bram@vim.org>
 
 " Quit when a (custom) syntax file was already loaded
@@ -318,6 +318,9 @@
 if !exists("c_no_c99") && !s:in_cpp_family
   syn keyword	cStorageClass	inline restrict
 endif
+if (s:ft ==# "c" && !exists("c_no_c23")) || (s:in_cpp_family && !exists("cpp_no_cpp11"))
+  syn keyword	cStorageClass	constexpr
+endif
 if !exists("c_no_c11")
   syn keyword	cStorageClass	_Alignas alignas
   syn keyword	cOperator	_Alignof alignof
diff --git a/runtime/syntax/testdir/dumps/c_keywords_00.dump b/runtime/syntax/testdir/dumps/c_keywords_00.dump
new file mode 100644
index 0000000..e6cbe43
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/c_keywords_00.dump
@@ -0,0 +1,20 @@
+>/+0#0000e05#ffffff0@1| |C| |k|e|y|w|o|r|d|s| +0#0000000&@61
+@75
+|/+0#0000e05&@1| |S|o|u|r|c|e|:| |h|t@1|p|s|:|/@1|e|n|.|c|p@1|r|e|f|e|r|e|n|c|e|.|c|o|m|/|w|/|c|/|k|e|y|w|o|r|d| +0#0000000&@24
+@75
+|a+0#00e0003&|l|i|g|n|a|s| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@58
+|a+0#af5f00255&|l|i|g|n|o|f| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@58
+|a+0#00e0003&|u|t|o| +0#0000000&@70
+|b+0#00e0003&|o@1|l| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@61
+|b+0#af5f00255&|r|e|a|k| +0#0000000&@69
+|c+0#af5f00255&|a|s|e| +0#0000000&@70
+|c+0#00e0003&|h|a|r| +0#0000000&@70
+|c+0#00e0003&|o|n|s|t| +0#0000000&@69
+|c+0#00e0003&|o|n|s|t|e|x|p|r| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@56
+|c+0#af5f00255&|o|n|t|i|n|u|e| +0#0000000&@66
+|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@67
+|d+0#af5f00255&|o| +0#0000000&@72
+|d+0#00e0003&|o|u|b|l|e| +0#0000000&@68
+|e+0#af5f00255&|l|s|e| +0#0000000&@70
+|e+0#00e0003&|n|u|m| +0#0000000&@70
+@57|1|,|1| @10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/c_keywords_01.dump b/runtime/syntax/testdir/dumps/c_keywords_01.dump
new file mode 100644
index 0000000..b1f0150
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/c_keywords_01.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|o|n|t|i|n|u|e| +0#0000000&@66
+|d+0#af5f00255&|e|f|a|u|l|t| +0#0000000&@67
+|d+0#af5f00255&|o| +0#0000000&@72
+|d+0#00e0003&|o|u|b|l|e| +0#0000000&@68
+|e+0#af5f00255&|l|s|e| +0#0000000&@70
+>e+0#00e0003&|n|u|m| +0#0000000&@70
+|e+0#00e0003&|x|t|e|r|n| +0#0000000&@68
+|f+0#e000002&|a|l|s|e| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@60
+|f+0#00e0003&|l|o|a|t| +0#0000000&@69
+|f+0#af5f00255&|o|r| +0#0000000&@71
+|g+0#af5f00255&|o|t|o| +0#0000000&@70
+|i+0#af5f00255&|f| +0#0000000&@72
+|i+0#00e0003&|n|l|i|n|e| +0#0000000&|/+0#0000e05&@1| |(|C|9@1|)| +0#0000000&@59
+|i+0#00e0003&|n|t| +0#0000000&@71
+|l+0#00e0003&|o|n|g| +0#0000000&@70
+|n+0#e000002&|u|l@1|p|t|r| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@58
+|r+0#00e0003&|e|g|i|s|t|e|r| +0#0000000&@66
+|r+0#00e0003&|e|s|t|r|i|c|t| +0#0000000&|/+0#0000e05&@1| |(|C|9@1|)| +0#0000000&@57
+|r+0#af5f00255&|e|t|u|r|n| +0#0000000&@68
+@57|1|9|,|1| @9|2|8|%| 
diff --git a/runtime/syntax/testdir/dumps/c_keywords_02.dump b/runtime/syntax/testdir/dumps/c_keywords_02.dump
new file mode 100644
index 0000000..6e6629d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/c_keywords_02.dump
@@ -0,0 +1,20 @@
+|r+0#af5f00255#ffffff0|e|t|u|r|n| +0#0000000&@68
+|s+0#00e0003&|h|o|r|t| +0#0000000&@69
+|s+0#00e0003&|i|g|n|e|d| +0#0000000&@68
+|s+0#af5f00255&|i|z|e|o|f| +0#0000000&@68
+|s+0#00e0003&|t|a|t|i|c| +0#0000000&@68
+>s+0#af5f00255&|t|a|t|i|c|_|a|s@1|e|r|t| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@52
+|s+0#00e0003&|t|r|u|c|t| +0#0000000&@68
+|s+0#af5f00255&|w|i|t|c|h| +0#0000000&@68
+|t+0#00e0003&|h|r|e|a|d|_|l|o|c|a|l| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@53
+|t+0#e000002&|r|u|e| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@61
+|t+0#00e0003&|y|p|e|d|e|f| +0#0000000&@67
+|t+0#af5f00255&|y|p|e|o|f| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@59
+|t+0#af5f00255&|y|p|e|o|f|_|u|n|q|u|a|l| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@52
+|u+0#00e0003&|n|i|o|n| +0#0000000&@69
+|u+0#00e0003&|n|s|i|g|n|e|d| +0#0000000&@66
+|v+0#00e0003&|o|i|d| +0#0000000&@70
+|v+0#00e0003&|o|l|a|t|i|l|e| +0#0000000&@66
+|w+0#af5f00255&|h|i|l|e| +0#0000000&@69
+@75
+@57|3|7|,|1| @9|6|8|%| 
diff --git a/runtime/syntax/testdir/dumps/c_keywords_03.dump b/runtime/syntax/testdir/dumps/c_keywords_03.dump
new file mode 100644
index 0000000..5483936
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/c_keywords_03.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|_+0#00e0003&|A|l|i|g|n|a|s| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)|(|d|e|p|r|e|c|a|t|e|d| |i|n| |C|2|3|)| +0#0000000&@38
+|_+0#af5f00255&|A|l|i|g|n|o|f| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)|(|d|e|p|r|e|c|a|t|e|d| |i|n| |C|2|3|)| +0#0000000&@38
+|_+0#00e0003&|A|t|o|m|i|c| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)| +0#0000000&@58
+|_+0#00e0003&|B|i|t|I|n|t| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@58
+>_+0#00e0003&|B|o@1|l| +0#0000000&|/+0#0000e05&@1| |(|C|9@1|)|(|d|e|p|r|e|c|a|t|e|d| |i|n| |C|2|3|)| +0#0000000&@41
+|_+0#00e0003&|C|o|m|p|l|e|x| +0#0000000&|/+0#0000e05&@1| |(|C|9@1|)| +0#0000000&@57
+|_+0#00e0003&|D|e|c|i|m|a|l|1|2|8| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@54
+|_+0#00e0003&|D|e|c|i|m|a|l|3|2| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@55
+|_+0#00e0003&|D|e|c|i|m|a|l|6|4| +0#0000000&|/+0#0000e05&@1| |(|C|2|3|)| +0#0000000&@55
+|_+0#af5f00255&|G|e|n|e|r|i|c| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)| +0#0000000&@57
+|_+0#00e0003&|I|m|a|g|i|n|a|r|y| +0#0000000&|/+0#0000e05&@1| |(|C|9@1|)| +0#0000000&@55
+|_+0#00e0003&|N|o|r|e|t|u|r|n| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)|(|d|e|p|r|e|c|a|t|e|d| |i|n| |C|2|3|)| +0#0000000&@37
+|_+0#af5f00255&|S|t|a|t|i|c|_|a|s@1|e|r|t| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)|(|d|e|p|r|e|c|a|t|e|d| |i|n| |C|2|3|)| +0#0000000&@32
+|_+0#00e0003&|T|h|r|e|a|d|_|l|o|c|a|l| +0#0000000&|/+0#0000e05&@1| |(|C|1@1|)|(|d|e|p|r|e|c|a|t|e|d| |i|n| |C|2|3|)| +0#0000000&@33
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|5@1|,|1| @9|B|o|t| 
diff --git a/runtime/syntax/testdir/input/c_keywords.c b/runtime/syntax/testdir/input/c_keywords.c
new file mode 100644
index 0000000..fc994c2
--- /dev/null
+++ b/runtime/syntax/testdir/input/c_keywords.c
@@ -0,0 +1,64 @@
+// C keywords
+
+// Source: https://en.cppreference.com/w/c/keyword
+
+alignas // (C23)
+alignof // (C23)
+auto
+bool // (C23)
+break
+case
+char
+const
+constexpr // (C23)
+continue
+default
+do
+double
+else
+enum
+extern
+false // (C23)
+float
+for
+goto
+if
+inline // (C99)
+int
+long
+nullptr // (C23)
+register
+restrict // (C99)
+return
+short
+signed
+sizeof
+static
+static_assert // (C23)
+struct
+switch
+thread_local // (C23)
+true // (C23)
+typedef
+typeof // (C23)
+typeof_unqual // (C23)
+union
+unsigned
+void
+volatile
+while
+
+_Alignas // (C11)(deprecated in C23)
+_Alignof // (C11)(deprecated in C23)
+_Atomic // (C11)
+_BitInt // (C23)
+_Bool // (C99)(deprecated in C23)
+_Complex // (C99)
+_Decimal128 // (C23)
+_Decimal32 // (C23)
+_Decimal64 // (C23)
+_Generic // (C11)
+_Imaginary // (C99)
+_Noreturn // (C11)(deprecated in C23)
+_Static_assert // (C11)(deprecated in C23)
+_Thread_local // (C11)(deprecated in C23)