| // RUN: rm -rf %t |
| // RUN: mkdir -p %t |
| // RUN: split-file %s %t |
| // |
| // RUN: %clang_cc1 -std=c++20 %t/bar.cppm -emit-module-interface -o %t/bar.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/foo.cc -fmodule-file=bar=%t/bar.pcm -fsyntax-only -verify |
| // |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/bar.cppm -emit-module-interface \ |
| // RUN: -o %t/bar.pcm |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/foo.cc \ |
| // RUN: -fmodule-file=bar=%t/bar.pcm -fsyntax-only -verify |
| // |
| // RUN: %clang_cc1 -std=c++20 %t/bar.cppm -emit-reduced-module-interface -o %t/bar.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/foo.cc -fmodule-file=bar=%t/bar.pcm -fsyntax-only -verify |
| // |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/bar.cppm -emit-reduced-module-interface \ |
| // RUN: -o %t/bar.pcm |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/foo.cc \ |
| // RUN: -fmodule-file=bar=%t/bar.pcm -fsyntax-only -verify |
| |
| //--- h.hpp |
| #pragma once |
| |
| struct T { |
| constexpr T(const char *) {} |
| }; |
| template <char... c> |
| struct t { |
| inline constexpr operator T() const { return {s}; } |
| |
| private: |
| inline static constexpr char s[]{c..., '\0'}; |
| }; |
| |
| //--- bar.cppm |
| module; |
| #include "h.hpp" |
| export module bar; |
| export inline constexpr auto k = t<'k'>{}; |
| |
| //--- foo.cc |
| // expected-no-diagnostics |
| #include "h.hpp" |
| import bar; |
| void f() { |
| T x = k; |
| } |