diff --git a/libcxx/include/__mbstate_t.h b/libcxx/include/__mbstate_t.h --- a/libcxx/include/__mbstate_t.h +++ b/libcxx/include/__mbstate_t.h @@ -27,6 +27,14 @@ // This does not define std::mbstate_t -- this only brings in the declaration // in the global namespace. +// We define this here to support older versions of glibc that do +// not define this for clang. This is also set in libc++'s header, +// and we need to do so here too to avoid a different function signature given +// a different include order. +#ifdef __cplusplus +# define __CORRECT_ISO_CPP_WCHAR_H_PROTO +#endif + #if __has_include() # include // works on most Unixes #elif __has_include() diff --git a/libcxx/include/wchar.h b/libcxx/include/wchar.h --- a/libcxx/include/wchar.h +++ b/libcxx/include/wchar.h @@ -116,6 +116,8 @@ # pragma GCC system_header #endif +// We define this here to support older versions of glibc that do +// not define this for clang. #ifdef __cplusplus #define __CORRECT_ISO_CPP_WCHAR_H_PROTO #endif diff --git a/libcxx/test/std/strings/c.strings/cwchar_include_order1.compile.verify.cpp b/libcxx/test/std/strings/c.strings/cwchar_include_order1.compile.verify.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/strings/c.strings/cwchar_include_order1.compile.verify.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// + +// XFAIL: no-wide-characters + +// Tests that include ordering does not affect the definition of wcsstr. +// See: https://llvm.org/PR62638 + +// clang-format off +#include +#include +// clang-format on + +void func() { + wchar_t* v1; + const wchar_t* cv2 = L"/"; + v1 = wcsstr(cv2, L"/"); // expected-error {{assigning to 'wchar_t *' from 'const wchar_t *' discards qualifiers}} +} diff --git a/libcxx/test/std/strings/c.strings/cwchar_include_order2.compile.verify.cpp b/libcxx/test/std/strings/c.strings/cwchar_include_order2.compile.verify.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/strings/c.strings/cwchar_include_order2.compile.verify.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// + +// XFAIL: no-wide-characters + +// Tests that include ordering does not affect the definition of wcsstr. +// See: https://llvm.org/PR62638 + +// clang-format off +#include +#include +// clang-format on + +void func() { + wchar_t* v1; + const wchar_t* cv2 = L"/"; + v1 = wcsstr(cv2, L"/"); // expected-error {{assigning to 'wchar_t *' from 'const wchar_t *' discards qualifiers}} +}