Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libcxx sporadic failure in std/strings/basic.string/string.cons/copy.pass.cpp #3949

Closed
StephanTLavavej opened this issue Aug 11, 2023 · 3 comments
Labels
not reproducible We can’t reproduce the described behavior test Related to test code

Comments

@StephanTLavavej
Copy link
Member

StephanTLavavej commented Aug 11, 2023

Sporadic failures:

Date PR Test Run
2023-08-10 #3913 https://dev.azure.com/vclibs/STL/_build/results?buildId=14819&view=results
2023-08-10 #3947 (CI) https://dev.azure.com/vclibs/STL/_build/results?buildId=14823&view=results
2023-08-17 #3952 (CI) https://dev.azure.com/vclibs/STL/_build/results?buildId=14889&view=results
2023-09-12 #4024 https://dev.azure.com/vclibs/STL/_build/results?buildId=15013&view=results
D:\a\_work\1\s\llvm-project\libcxx\test\std\strings\basic.string\string.cons\copy.pass.cpp(56): error C2131: expression did not evaluate to a constant

It's highly curious that a compiler error could be sporadic. This might be related to #3862.

@StephanTLavavej StephanTLavavej added high priority Important! test Related to test code labels Aug 11, 2023
@CaseyCarter
Copy link
Member

The test in question:

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// <string>

// basic_string(const basic_string<charT,traits,Allocator>& str); // constexpr since C++20

#include <string>
#include <cassert>

#include "test_macros.h"
#include "test_allocator.h"
#include "min_allocator.h"

template <class S>
TEST_CONSTEXPR_CXX20 void
test(S s1)
{
    S s2 = s1;
    LIBCPP_ASSERT(s2.__invariants());
    assert(s2 == s1);
    assert(s2.capacity() >= s2.size());
    assert(s2.get_allocator() == s1.get_allocator());
}

TEST_CONSTEXPR_CXX20 bool test() {
  {
    typedef test_allocator<char> A;
    typedef std::basic_string<char, std::char_traits<char>, A> S;
    test(S(A(3)));
    test(S("1", A(5)));
    test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)));
  }
#if TEST_STD_VER >= 11
  {
    typedef min_allocator<char> A;
    typedef std::basic_string<char, std::char_traits<char>, A> S;
    test(S(A{}));
    test(S("1", A()));
    test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()));
  }
#endif

  return true;
}

int main(int, char**)
{
  test();
#if TEST_STD_VER > 17
  static_assert(test()); // <-------- This is line 56.
#endif

  return 0;
}

The error message is effectively telling us "something went wrong somewhere in the test", which isn't terribly useful. The test code looks fine: min_allocator uses a fancy pointer min_pointer with a constexpr explicit conversion from min_pointer<void> to min_pointer<T> that can't possibly be constexpr, but the test doesn't use it.

@StephanTLavavej
Copy link
Member Author

I was able to reproduce this locally by reconstructing the full command line:

for /L %I in (1,1,100) do @cl.EXE %STL%\llvm-project\libcxx\test\std\strings\basic.string\string.cons\copy.pass.cpp /I %STL%\llvm-project\libcxx\test\support /nologo /Od /W4 /w14061 /w14242 /w14265 /w14582 /w14583 /w14587 /w14588 /w14749 /w14841 /w14842 /w15038 /w15214 /w15215 /w15216 /w15217 /w15262 /sdl /WX /D_ENABLE_STL_INTERNAL_CHECK /bigobj /EHsc /MTd /std:c++latest /permissive- /utf-8 /FImsvc_stdlib_force_include.h /wd4643 /D_STL_CALL_ABORT_INSTEAD_OF_INVALID_PARAMETER /analyze:autolog- /Zc:preprocessor /wd6262 -link /MANIFEST:EMBED

This is after set STL=D:\GitHub\STL for my repo root, and building the STL and running set_environment.bat to use it. I had to run this several times so it looks like it happens once in every few hundred runs.

Still not sure what's happening here. Seems like a compiler bug.

@StephanTLavavej StephanTLavavej added not reproducible We can’t reproduce the described behavior and removed high priority Important! labels Jan 25, 2024
@StephanTLavavej
Copy link
Member Author

We don't believe we've seen this happen since 2023-09-12. Possibly #4031 merged on 2023-09-21 changed basic_string's code sufficiently to avoid triggering this, or the VS 2022 17.8 Preview 2 toolset update #4028 merged on 2023-09-14 (or any later update) fixed whatever sporadic compiler bug was involved here.

@StephanTLavavej StephanTLavavej closed this as not planned Won't fix, can't repro, duplicate, stale Jan 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
not reproducible We can’t reproduce the described behavior test Related to test code
Projects
None yet
Development

No branches or pull requests

2 participants