[PATCH] D26136: Protect exceptional path under libcpp-no-exceptions

Roger Ferrer Ibanez via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 31 03:08:30 PDT 2016

rogfer01 added inline comments.

Comment at: test/std/strings/basic.string/string.access/at.pass.cpp:41
+    const S& cs = s;
+    if (pos < cs.size())
+    {
rmaprath wrote:
> For the cases where an exception //should've been// thrown, are we not entering the **undefined** domain at this point?
> What if instead, we define two versions of the `test()` function? one containing the current code as-is, and the other only handles the cases where exceptions are not expected, and we modify the `main()` function below so that the correct `test()` case is invoked depending on the presence  / absence of exceptions? It's a bit more cumbersome than the current setup, but I'm not totally happy about treading into the undefined domain (if my understanding above is correct). 
If I understand this test correctly, it checks for the `at` member function. While certainly binding a const reference might throw, here it is bound to a lvalue of the same type so no temporary construction should happen.

The original test checks both `s.size()` and `cs.size()`. Given that `size` is a const member function it probably does not matter given that `cs` and `s` are aliased, but see comment below.

Comment at: test/std/strings/basic.string/string.access/at.pass.cpp:45
+        assert(cs.at(pos) == cs[pos]);
+        assert(pos < cs.size());
+    }
This is redundant, maybe I should change the if condition to be `if (pos < s.size())`


More information about the cfe-commits mailing list