r373281 - [c++20] Add a C++20 version of the existing turing machine test.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 30 17:47:41 PDT 2019


Author: rsmith
Date: Mon Sep 30 17:47:41 2019
New Revision: 373281

URL: http://llvm.org/viewvc/llvm-project?rev=373281&view=rev
Log:
[c++20] Add a C++20 version of the existing turing machine test.

Unlike the C++11 version, this one uese mutable state and dynamic
allocation instead of a carefully balanced and ever-accumulating pile of
temporaries.

Added:
    cfe/trunk/test/SemaCXX/constexpr-turing-cxx2a.cpp

Added: cfe/trunk/test/SemaCXX/constexpr-turing-cxx2a.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constexpr-turing-cxx2a.cpp?rev=373281&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/constexpr-turing-cxx2a.cpp (added)
+++ cfe/trunk/test/SemaCXX/constexpr-turing-cxx2a.cpp Mon Sep 30 17:47:41 2019
@@ -0,0 +1,66 @@
+// RUN: %clang_cc1 -verify -std=c++2a %s
+// expected-no-diagnostics
+
+const unsigned halt = (unsigned)-1;
+
+enum Dir { L, R };
+struct Action {
+  bool tape;
+  Dir dir;
+  unsigned next;
+};
+using State = Action[2];
+
+// An infinite tape!
+struct Tape {
+  constexpr Tape() = default;
+  constexpr ~Tape() {
+    if (l) { l->r = nullptr; delete l; }
+    if (r) { r->l = nullptr; delete r; }
+  }
+  constexpr Tape *left() {
+    if (!l) { l = new Tape; l->r = this; }
+    return l;
+  }
+  constexpr Tape *right() {
+    if (!r) { r = new Tape; r->l = this; }
+    return r;
+  }
+  Tape *l = nullptr;
+  bool val = false;
+  Tape *r = nullptr;
+};
+
+// Run turing machine 'tm' on tape 'tape' from state 'state'. Return number of
+// steps taken until halt.
+constexpr unsigned run(const State *tm) {
+  Tape *tape = new Tape;
+  unsigned state = 0;
+  unsigned steps = 0;
+
+  for (state = 0; state != halt; ++steps) {
+    auto [val, dir, next_state] = tm[state][tape->val];
+    tape->val = val;
+    tape = (dir == L ? tape->left() : tape->right());
+    state = next_state;
+  }
+
+  delete tape;
+  return steps;
+}
+
+// 3-state busy beaver. S(bb3) = 21.
+constexpr State bb3[] = {
+  { { true, R, 1 }, { true, R, halt } },
+  { { true, L, 1 }, { false, R, 2 } },
+  { { true, L, 2 }, { true, L, 0 } }
+};
+static_assert(run(bb3) == 21, "");
+
+// 4-state busy beaver. S(bb4) = 107.
+constexpr State bb4[] = {
+  { { true, R, 1 }, { true, L, 1 } },
+  { { true, L, 0 }, { false, L, 2 } },
+  { { true, R, halt }, { true, L, 3 } },
+  { { true, R, 3 }, { false, R, 0 } } };
+static_assert(run(bb4) == 107, "");




More information about the cfe-commits mailing list