From b82be14e2605623c28faf097f86f5c5518385e82 Mon Sep 17 00:00:00 2001
From: Daniel Ehrenberg <littledan@chromium.org>
Date: Wed, 5 Apr 2017 09:50:47 +0200
Subject: [PATCH] Add tests for invalid \c in character class

This patch implements tests for https://github.com/tc39/ecma262/pull/864
---
 ...-invalid-control-escape-character-class.js | 53 +++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 test/annexB/built-ins/RegExp/RegExp-invalid-control-escape-character-class.js

diff --git a/test/annexB/built-ins/RegExp/RegExp-invalid-control-escape-character-class.js b/test/annexB/built-ins/RegExp/RegExp-invalid-control-escape-character-class.js
new file mode 100644
index 0000000000..6a3d448034
--- /dev/null
+++ b/test/annexB/built-ins/RegExp/RegExp-invalid-control-escape-character-class.js
@@ -0,0 +1,53 @@
+// Copyright 2017 the V8 project authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: prod-annexB-ClassEscape
+description: >
+  Character classes containing an invalid control escape behave like [\\c]
+info: >
+  ClassEscape :: [~U] `c`
+
+  The production ClassEscape :: `c` evaluates as follows:
+    1. Return the CharSet containing the characters `\` and `c`.
+---*/
+
+function* invalidControls() {
+  // Check ASCII characters which are not in the extended range or syntax
+  // characters
+  for (let alpha = 0x00; alpha <= 0x7F; alpha++) {
+    let letter = String.fromCharCode(alpha);
+    if (!letter.match(/[0-9A-Za-z_\$(|)\[\]\/\\^]/)) {
+      yield letter;
+    }
+  }
+  yield "";
+}
+
+for (let letter of invalidControls()) {
+  var source = "[\\c" + letter + "]";
+  var re = new RegExp(source);
+
+  if (letter.length > 0) {
+    var char = letter.charCodeAt(0);
+    var str = String.fromCharCode(char % 32);
+    var arr = re.exec(str);
+    if (str !== letter && arr !== null) {
+      $ERROR(`Character ${letter} unreasonably wrapped around as a control character`);
+    }
+
+    arr = re.exec(letter);
+    if (arr === null) {
+      $ERROR(`Character ${letter} missing from character class ${source}`);
+    }
+  }
+  arr = re.exec("\\")
+  if (arr === null) {
+    $ERROR(`Character \\ missing from character class ${source}`);
+  }
+  arr = re.exec("c")
+  if (arr === null) {
+    $ERROR(`Character c missing from character class ${source}`);
+  }
+}
+
-- 
GitLab