xref: /llvm-project/clang/test/Modules/hashing-decls-in-exprs-from-gmf.cppm (revision 3f6bc1adf805681293c2ef0b93b708ff52244c00)
1// RUN: rm -rf %t
2// RUN: mkdir -p %t
3// RUN: split-file %s %t
4//
5// RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/A.cppm -emit-module-interface -o %t/A.pcm
6// RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/B.cppm -emit-module-interface -o %t/B.pcm
7// RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/test.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
8
9//--- header.h
10#pragma once
11template <class _Tp>
12class Optional {};
13
14template <class _Tp>
15concept C = requires(const _Tp& __t) {
16    []<class _Up>(const Optional<_Up>&) {}(__t);
17};
18
19//--- func.h
20#include "header.h"
21template <C T>
22void func() {}
23
24//--- duplicated_func.h
25#include "header.h"
26template <C T>
27void duplicated_func() {}
28
29//--- test_func.h
30#include "func.h"
31
32void test_func() {
33    func<Optional<int>>();
34}
35
36//--- test_duplicated_func.h
37#include "duplicated_func.h"
38
39void test_duplicated_func() {
40    duplicated_func<Optional<int>>();
41}
42
43//--- A.cppm
44module;
45#include "header.h"
46#include "test_duplicated_func.h"
47export module A;
48export using ::test_duplicated_func;
49
50//--- B.cppm
51module;
52#include "header.h"
53#include "test_func.h"
54#include "test_duplicated_func.h"
55export module B;
56export using ::test_func;
57export using ::test_duplicated_func;
58
59//--- test.cpp
60// expected-no-diagnostics
61import A;
62import B;
63
64void test() {
65    test_func();
66    test_duplicated_func();
67}
68