Page MenuHomePhabricator

[libc++] P0980R1 (constexpr std::string)
Changes PlannedPublic

Authored by philnik on Sep 27 2021, 4:48 PM.

Details

Reviewers
Quuxplusone
ldionne
Group Reviewers
Restricted Project
Summary

Make std::string constexpr

In the guidelines it said I should write tests, but how do I write tests for the constexpr stuff and where do I put them?

Diff Detail

Unit TestsFailed

TimeTest
720 mslibcxx CI Apple back-deployment macosx10.15 > libc++.std/numerics/numeric_ops/accumulate::accumulate_op.pass.cpp
Script: -- : 'COMPILED WITH'; /Library/Developer/CommandLineTools/usr/bin/c++ /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/std/numerics/numeric.ops/accumulate/accumulate_op.pass.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -v --target=x86_64-apple-macosx10.15 -include /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support/nasty_macros.h -nostdinc++ -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/include/c++/v1 -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/libcxx/include/c++build -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support -std=c++2a -Werror -Wall -Wextra -Wshadow -Wundef -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-c++11-extensions -Wno-user-defined-literals -Wno-noexcept-type -Wno-atomic-alignment -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -fcoroutines-ts -Werror=thread-safety -Wuser-defined-warnings -Wno-macro-redefined -D_LIBCPP_HAS_THREAD_API_PTHREAD -Wno-macro-redefined -D_LIBCPP_ABI_VERSION=1 -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_FORMAT -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_RANGES -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/lib -Wl,-rpath,/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/macos-roots/macOS/libc++/10.15 -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple…
850 mslibcxx CI Apple back-deployment macosx10.15 > libc++.std/numerics/numeric_ops/inner_product::inner_product_comp.pass.cpp
Script: -- : 'COMPILED WITH'; /Library/Developer/CommandLineTools/usr/bin/c++ /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/std/numerics/numeric.ops/inner.product/inner_product_comp.pass.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -v --target=x86_64-apple-macosx10.15 -include /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support/nasty_macros.h -nostdinc++ -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/include/c++/v1 -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/libcxx/include/c++build -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support -std=c++2a -Werror -Wall -Wextra -Wshadow -Wundef -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-c++11-extensions -Wno-user-defined-literals -Wno-noexcept-type -Wno-atomic-alignment -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -fcoroutines-ts -Werror=thread-safety -Wuser-defined-warnings -Wno-macro-redefined -D_LIBCPP_HAS_THREAD_API_PTHREAD -Wno-macro-redefined -D_LIBCPP_ABI_VERSION=1 -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_FORMAT -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_RANGES -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/lib -Wl,-rpath,/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/macos-roots/macOS/libc++/10.15 -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx…
780 mslibcxx CI Apple back-deployment macosx10.15 > libc++.std/strings/basic_string/string_capacity::resize_size.pass.cpp
Script: -- : 'COMPILED WITH'; /Library/Developer/CommandLineTools/usr/bin/c++ /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/std/strings/basic.string/string.capacity/resize_size.pass.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -v --target=x86_64-apple-macosx10.15 -include /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support/nasty_macros.h -nostdinc++ -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/include/c++/v1 -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/libcxx/include/c++build -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support -std=c++2a -Werror -Wall -Wextra -Wshadow -Wundef -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-c++11-extensions -Wno-user-defined-literals -Wno-noexcept-type -Wno-atomic-alignment -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -fcoroutines-ts -Werror=thread-safety -Wuser-defined-warnings -Wno-macro-redefined -D_LIBCPP_HAS_THREAD_API_PTHREAD -Wno-macro-redefined -D_LIBCPP_ABI_VERSION=1 -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_FORMAT -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_RANGES -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/lib -Wl,-rpath,/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/macos-roots/macOS/libc++/10.15 -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx…
780 mslibcxx CI Apple back-deployment macosx10.15 > libc++.std/strings/basic_string/string_capacity::resize_size_char.pass.cpp
Script: -- : 'COMPILED WITH'; /Library/Developer/CommandLineTools/usr/bin/c++ /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/std/strings/basic.string/string.capacity/resize_size_char.pass.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -v --target=x86_64-apple-macosx10.15 -include /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support/nasty_macros.h -nostdinc++ -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/include/c++/v1 -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/libcxx/include/c++build -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support -std=c++2a -Werror -Wall -Wextra -Wshadow -Wundef -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-c++11-extensions -Wno-user-defined-literals -Wno-noexcept-type -Wno-atomic-alignment -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -fcoroutines-ts -Werror=thread-safety -Wuser-defined-warnings -Wno-macro-redefined -D_LIBCPP_HAS_THREAD_API_PTHREAD -Wno-macro-redefined -D_LIBCPP_ABI_VERSION=1 -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_FORMAT -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_RANGES -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/lib -Wl,-rpath,/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/macos-roots/macOS/libc++/10.15 -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx…
770 mslibcxx CI Apple back-deployment macosx10.15 > libc++.std/strings/basic_string/string_capacity::shrink_to_fit.pass.cpp
Script: -- : 'COMPILED WITH'; /Library/Developer/CommandLineTools/usr/bin/c++ /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/std/strings/basic.string/string.capacity/shrink_to_fit.pass.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -v --target=x86_64-apple-macosx10.15 -include /Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support/nasty_macros.h -nostdinc++ -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/include/c++/v1 -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/libcxx/include/c++build -I/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/libcxx/test/support -std=c++2a -Werror -Wall -Wextra -Wshadow -Wundef -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-c++11-extensions -Wno-user-defined-literals -Wno-noexcept-type -Wno-atomic-alignment -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -fcoroutines-ts -Werror=thread-safety -Wuser-defined-warnings -Wno-macro-redefined -D_LIBCPP_HAS_THREAD_API_PTHREAD -Wno-macro-redefined -D_LIBCPP_ABI_VERSION=1 -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_FORMAT -Wno-macro-redefined -D_LIBCPP_HAS_NO_INCOMPLETE_RANGES -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/lib -Wl,-rpath,/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx-ci/build/apple-system-backdeployment-10.15/macos-roots/macOS/libc++/10.15 -L/Users/libcxx-buildkite-agent/libcxx.buildkite-agent/builds/y10-8-macminivault-com-1/llvm-project/libcxx…
View Full Test Results (180 Failed)

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes
  • Merge branch 'main' of github.com:llvm/llvm-project
  • casting __begin_lifetime arguments to void if not in c++20
philnik marked an inline comment as not done.Sep 28 2021, 5:11 PM
philnik added inline comments.
libcxx/include/__memory/compressed_pair.h
61–63

I'm not sure what the problem is, but the test for C++11 fails (it think) because of the change to _LIBCPP_CONSTEXPR. C++03, C++14 and C++17 work fine. C++20 and C++2b most likely fail because constexpr string just doesn't work properly. Should I just change it to _LIBCPP_CONSTEXPR_AFTER_CXX11?

philnik updated this revision to Diff 375854.Sep 29 2021, 6:08 AM
philnik marked an inline comment as not done.
  • More tests - all are passing locally
Quuxplusone added inline comments.Sep 29 2021, 7:20 AM
libcxx/include/__memory/compressed_pair.h
61–63

I suspect the problem is that in C++11, all constexpr member functions become implicitly const. (We did not really understand what constexpr should mean, until C++14. ;)) So for any non-const member functions, like __get() #1, you have to mark them as _LIBCPP_CONSTEXPR_AFTER_CXX11; but for const member functions, like __get() #2, you should still be able to use plain _LIBCPP_CONSTEXPR. Try that and see if I'm right. :)

philnik marked 2 inline comments as done.Sep 29 2021, 7:39 AM
philnik updated this revision to Diff 375884.Sep 29 2021, 7:44 AM
  • Merge branch 'main' of github.com:llvm/llvm-project
  • changed _LIBCPP_CONSTEXPR to _LIBCPP_CONSTEXPR_AFTER_CXX11 for non-const member functions of __compressed_pair
philnik updated this revision to Diff 376185.Sep 30 2021, 6:35 AM
  • Even more tests
philnik updated this revision to Diff 376551.Oct 1 2021, 9:29 AM
  • And again more tests
Quuxplusone requested changes to this revision.Oct 1 2021, 9:54 AM
Quuxplusone added inline comments.
libcxx/include/__string
308–315

For sanity's sake, these foo_constexpr functions should all begin with _LIBCPP_ASSERT(__libcpp_is_constant_evaluated()); — we don't expect them ever to be called at runtime. (In '20 we could make them consteval; but I think the assertion is the better, more explicit, solution, even in '20.) If this new/delete dance ever got codegenned into runtime code, that would be horrible. We could add the assert in a separate PR, or just roll it into this one.

__copy_constexpr(... should be _VSTD::__copy_constexpr(... for ADL-proofing.

libcxx/include/string
623–624

Bogus extra space here.

libcxx/test/std/strings/basic.string/string.capacity/clear.pass.cpp
60–62

Whitespace nit: I'd prefer to remove these blank lines (60 and 62), in that they don't really help anything. Ditto throughout.
However, excellent transformations of all these tests! This is exactly what I had in mind, and I'm glad it's mostly turning out to be easy. (Assuming the transformed tests do still pass, of course.)

libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp
109–111

IIUC, you're preemptively changing this test so that once constexpr vector is supported, the test suite will magically pick it up and start testing it. This seems gratuitous; I'd rather see constexpr vector test-suite changes happen at the same time as their matching code changes, so that we can see from looking at the PR that "yes, we thought about test coverage." Having the test suite magically adapt to test only what works is, like, the opposite of the point of a test suite. ;)
Also, preemptive changes like this are potentially incorrect. In this case, I'm pretty sure that this test cannot be constexpr, because it relies on throw/catch. So it passes today because constexpr vector isn't implemented; but as soon as we implement that code change, we'll find that this test starts failing for unrelated reasons.

I suggest replacing this diff with more like // TODO: update when P1004 constexpr vector is implemented.

libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp
61

In general, I wish you weren't clang-formatting these files as you change them. In most cases, Phabricator can deal sensibly with the gratuitous whitespace changes, but in some cases (like this file), the gratuitous whitespace diffs are actively distracting. Remember, just don't use clang-format and you won't have problems.

libcxx/test/support/test_allocator.h
89–93 ↗(On Diff #376551)
  • Since this is not public-facing, let's try to use the "most/oldest" constexpr possible. E.g. this one can be TEST_CONSTEXPR_CXX14, and some of the others can probably be just constexpr.
  • I'm not thrilled with the general idea here of "skip some of the effects when constexpr-evaluated." It would be much cleaner (but possibly make a huge PR) to either (1) leave test_allocator as non-constexpr-friendly, and skip those tests in constexpr mode; or (2) refactor test_allocator's statistics collection to be constexpr-friendly; basically it would hold a test_allocator_statistics *stats_ in addition to its data_ and id_, and we'd make sure that all the tests that care about the stats always initialize their test_allocator instances with some &localstats, and then look at localstats.count rather than trying to look at the global test_allocator_base::count etc.

What's your opinion on those ideas?

libcxx/test/support/test_macros.h
13

Do we need the __has_include dance here, for the benefit of non-libc++ libraries? (The answer is above my pay grade.)

This revision now requires changes to proceed.Oct 1 2021, 9:54 AM
philnik marked 3 inline comments as done.Oct 1 2021, 11:46 AM
philnik added inline comments.
libcxx/test/std/strings/basic.string/string.cons/substr.pass.cpp
109–111

I think there is no need for a TODO, since the test, as you said yourself, tests an exception and therefore wouldn't work even if constexpr vector was implemented.

libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp
61

If you tell me how to disable the linter check before uploading I can do that. But I haven't seen any way around that, since it won't upload unless all lint checks work.

libcxx/test/support/test_allocator.h
89–93 ↗(On Diff #376551)

Since it would probably be needed at some point anyways, I think it's best to open a new PR to make test_alloc_base and test_allocator constexpr. I'll try it in the next few days.

philnik added inline comments.Oct 2 2021, 12:32 PM
libcxx/test/std/strings/basic.string/string.contains/contains.ptr.pass.cpp
61

OK forget it. Seems I'm just not capable of reading docs.

philnik updated this revision to Diff 377269.Oct 5 2021, 8:54 AM
  • string.modifiers tests now working
philnik updated this revision to Diff 378643.Oct 11 2021, 6:01 AM
  • Merge branch 'main' of github.com:llvm/llvm-project
  • All tests are now rewritten and passing
Quuxplusone added inline comments.Oct 11 2021, 8:30 AM
libcxx/test/support/test_allocator.h
89–93 ↗(On Diff #376551)

Now that D110994 exists, please "Add Parent Revision" to D110598, marking D110994 as a parent of D110598. (That's in the right sidebar of this page on Phabricator, https://reviews.llvm.org/D110598 .) That should make this PR's diff a lot smaller, while still allowing buildkite to build it properly.

philnik marked 4 inline comments as done.Oct 11 2021, 11:31 AM
philnik added inline comments.
libcxx/test/support/test_allocator.h
89–93 ↗(On Diff #376551)

Do I have to merge the two and upload that? (and I think "a lot" is too strong of a statement here)

Quuxplusone added inline comments.Oct 11 2021, 11:41 AM
libcxx/test/support/test_allocator.h
89–93 ↗(On Diff #376551)

I'm not sure what the arc diff workflow looks like. For my manual workflow, what you'd do is:

  • git fetch upstream main
  • git checkout D110994 ; git rebase -i upstream/main
  • git diff -U999 upstream/main D110994 > ~/foo.diff
  • https://reviews.llvm.org/D110994 "Update Diff", "Raw Diff From File", upload the foo.diff you just created
  • git checkout D110598 ; git rebase -i D110994
  • git diff -U999 D110994 D110598 > ~/foo.diff
  • https://reviews.llvm.org/D110598 "Update Diff", "Raw Diff From File", upload the foo.diff you just created

So, no, I would say that "merging the two" is the exact opposite of what we're doing here. We're rebasing D110598 on top of D110994, so that the diff presented here for D110598 will not include any of D110994's changes (except that it will be based on top of them "by reference"). In git terms, the diff presented for D110994 will be main...D110994; the diff presented for D110598 will be D110994...D110598.

(P.S. I infer from your update comments that you've been doing a lot of "merge commits" (multi-parent git commits); you'll need to squash those away. Prefer a rebase-oriented workflow, where you keep scooping up your one atomic change and rebasing it on top of other people's unrelated changes in main, rather than incrementally modifying your change by merging new unrelated changes from main into it.)

philnik updated this revision to Diff 379128.Oct 12 2021, 11:43 AM
  • added GCC workaround and formatting changes
  • Updated allocator tests
philnik updated this revision to Diff 383578.Sat, Oct 30, 4:40 AM
  • removed test_allocator_statistics from some tests
philnik updated this revision to Diff 385377.Sun, Nov 7, 3:51 PM

Rebased onto main and some cleanup

MTC added a subscriber: MTC.Sun, Nov 7, 5:47 PM
philnik updated this revision to Diff 385725.Tue, Nov 9, 12:51 AM
  • Changed split non-/constexpr tests into one and used TEST_IS_CONSTANT_EVALUATED
  • replaced main() with main(int, char**)
  • Updated feature-test macro
philnik added a subscriber: ldionne.

Maybe @ldionne should take a look at this PR too, since it's his paper.

philnik updated this revision to Diff 388153.Thu, Nov 18, 4:07 AM

Rebased and added GCC workaround

philnik planned changes to this revision.Thu, Nov 18, 4:33 AM
philnik planned changes to this revision.Mon, Nov 22, 6:50 AM
philnik updated this revision to Diff 390217.Sun, Nov 28, 10:35 AM
  • Rebased
  • check for nullptr
philnik updated this revision to Diff 390219.Sun, Nov 28, 11:04 AM

removed XFAIL for GCC

philnik updated this revision to Diff 390222.Sun, Nov 28, 12:39 PM
  • Removed debugging stuff for constant evaluation
  • fixed some tests
philnik updated this revision to Diff 390226.Sun, Nov 28, 2:35 PM
  • Added check
  • Using __wrap_iter now only during runtime
philnik planned changes to this revision.Sun, Nov 28, 3:54 PM