From 74ed102cabcdede68effff2b2cbaa038b936c76c Mon Sep 17 00:00:00 2001
From: Maxime Coste <mawww@kakoune.org>
Date: Mon, 9 Oct 2017 18:38:34 +0800
Subject: [PATCH] Regex: Tweak definition of character class and control escape
 tables

---
 src/regex_impl.cc | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/src/regex_impl.cc b/src/regex_impl.cc
index 11290054d..178a5b9fe 100644
--- a/src/regex_impl.cc
+++ b/src/regex_impl.cc
@@ -489,30 +489,32 @@ private:
     Iterator m_pos;
     bool m_ignore_case = false;
 
-    struct CharacterClassEscape {
+    static constexpr struct CharacterClassEscape {
         Codepoint cp;
         const char* ctype;
         StringView additional_chars;
         bool neg;
+    } character_class_escapes[] = {
+        { 'd', "digit", "", false },
+        { 'w', "alnum", "_", false },
+        { 's', "space", "", false },
+        { 'h', nullptr, " \t", false },
     };
-    static const CharacterClassEscape character_class_escapes[4];
 
-    struct ControlEscape { Codepoint name; Codepoint value; };
-    static const ControlEscape control_escapes[5];
+    static constexpr struct ControlEscape {
+        Codepoint name;
+        Codepoint value;
+    } control_escapes[] = {
+        { 'f', '\f' },
+        { 'n', '\n' },
+        { 'r', '\r' },
+        { 't', '\t' },
+        { 'v', '\v' }
+    };
 };
 
-// For some reason Gcc fails to link if this is constexpr
-const RegexParser::CharacterClassEscape RegexParser::character_class_escapes[4] = {
-    { 'd', "digit", "", false },
-    { 'w', "alnum", "_", false },
-    { 's', "space", "", false },
-    { 'h', nullptr, " \t", false },
-};
-
-
-const RegexParser::ControlEscape RegexParser::control_escapes[5] = {
-    { 'f', '\f' }, { 'n', '\n' }, { 'r', '\r' }, { 't', '\t' }, { 'v', '\v' }
-};
+constexpr RegexParser::CharacterClassEscape RegexParser::character_class_escapes[];
+constexpr RegexParser::ControlEscape RegexParser::control_escapes[];
 
 struct RegexCompiler
 {