xref: /llvm-project/clang/test/Modules/inconsistent-deduction-guide-linkage.cppm (revision f21ead06750b670cf8ce72d6666e3550b04056a2)
1// RUN: rm -fr %t
2// RUN: mkdir %t
3// RUN: split-file %s %t
4//
5// RUN: %clang_cc1 -std=c++20 %t/B.cppm -I%t -emit-module-interface -o %t/B.pcm
6// RUN: %clang_cc1 -std=c++20 -fsyntax-only %t/A.cppm -I%t -fprebuilt-module-path=%t -verify
7//
8// RUN: %clang_cc1 -std=c++20 %t/D.cppm -I%t -emit-module-interface -o %t/D.pcm
9// RUN: %clang_cc1 -std=c++20 -fsyntax-only %t/D-part.cppm -I%t -fprebuilt-module-path=%t -verify
10
11// RUN: %clang_cc1 -std=c++20 %t/B.cppm -I%t -emit-reduced-module-interface -o %t/B.pcm
12// RUN: %clang_cc1 -std=c++20 -fsyntax-only %t/A.cppm -I%t -fprebuilt-module-path=%t -verify
13//
14// RUN: %clang_cc1 -std=c++20 %t/D.cppm -I%t -emit-reduced-module-interface -o %t/D.pcm
15// RUN: %clang_cc1 -std=c++20 -fsyntax-only %t/D-part.cppm -I%t -fprebuilt-module-path=%t -verify
16
17//--- A.cppm
18module;
19export module baz:A;
20import B;
21#include "C.h"
22
23//--- B.cppm
24module;
25
26#include "C.h"
27export module B;
28
29namespace foo {
30    export using foo::bar;
31}
32
33//--- C.h
34namespace foo {
35  template<class T, class U> struct bar { // expected-error {{declaration of 'bar' in module baz:A follows declaration in the global module}} // expected-note {{previous declaration is here}}
36      template<class, class> bar(T, U);
37  };
38  template<class T, class U> bar(T, U) -> bar<T, U>; // expected-error {{declaration of '<deduction guide for bar>' in module baz:A follows declaration in the global module}} // expected-note {{previous declaration is here}}
39}
40
41//--- D.cppm
42// Tests that it is still problematic if they are in one module.
43module;
44#include "E.h"
45export module D;
46
47namespace foo {
48    export using foo::bar;
49}
50
51//--- D-part.cppm
52export module D:part;
53import D;
54#include "E.h"
55
56//--- E.h
57// another file for simpler diagnostics.
58namespace foo {
59  template<class T, class U> struct bar { // expected-error {{declaration of 'bar' in module D:part follows declaration in the global module}} // expected-note {{previous declaration is here}}
60      template<class, class> bar(T, U);
61  };
62  template<class T, class U> bar(T, U) -> bar<T, U>; // expected-error {{declaration of '<deduction guide for bar>' in module D:part follows declaration in the global module}} // expected-note {{previous declaration is here}}
63}
64