| // RUN: rm -fR %t |
| // RUN: split-file %s %t |
| // RUN: cd %t |
| // RUN: %clang_cc1 -verify -w -std=c++20 -fmodule-name=h1.h -emit-header-unit -xc++-user-header h1.h -o h1.pcm |
| // RUN: %clang_cc1 -verify -w -std=c++20 -fmodule-map-file=module.modulemap -fmodule-file=h1.h=h1.pcm main.cpp -o main.o |
| |
| //--- module.modulemap |
| module "h1.h" { |
| header "h1.h" |
| export * |
| } |
| |
| //--- h0.h |
| // expected-no-diagnostics |
| #pragma once |
| namespace std { |
| |
| template <class _CharT, class = _CharT, class = _CharT> class basic_string; |
| |
| namespace pmr { |
| using string = basic_string<char>; |
| } |
| |
| template <class, class, class> |
| class __attribute__((__preferred_name__(pmr::string))) basic_string; |
| |
| template <class> class basic_string_view {}; |
| |
| template <class _CharT, class _Traits, class _Allocator> class basic_string { |
| typedef _CharT value_type; |
| typedef _Allocator allocator_type; |
| struct __rep; |
| public: |
| template <class _Tp> |
| basic_string(_Tp) {} |
| basic_string operator+=(value_type); |
| }; |
| |
| namespace filesystem { |
| class path { |
| typedef char value_type; |
| value_type preferred_separator; |
| typedef basic_string<value_type> string_type; |
| typedef basic_string_view<value_type> __string_view; |
| template <class _Source> void append(_Source) { |
| __pn_ += preferred_separator; |
| } |
| void __root_directory() { append(string_type(__string_view{})); } |
| string_type __pn_; |
| }; |
| } // namespace filesystem |
| } // namespace std |
| |
| //--- h1.h |
| // expected-no-diagnostics |
| #pragma once |
| |
| #include "h0.h" |
| |
| //--- main.cpp |
| // expected-no-diagnostics |
| #include "h0.h" |
| |
| import "h1.h"; |