
Close https://github.com/llvm/llvm-project/issues/71034 See https://discourse.llvm.org/t/rfc-c-20-modules-introduce-thin-bmi-and-decls-hash/74755 This patch introduces reduced BMI, which doesn't contain the definitions of functions and variables if its definitions won't contribute to the ABI. Testing is a big part of the patch. We want to make sure the reduced BMI contains the same behavior with the existing and relatively stable fatBMI. This is pretty helpful for further reduction. The user interfaces part it left to following patches to ease the reviewing.
120 lines
3.4 KiB
C++
120 lines
3.4 KiB
C++
// Tests that we can merge the concept declarations with lambda well.
|
|
//
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/A0.cppm -emit-module-interface -o %t/A0.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A1.cppm -emit-module-interface -o %t/A1.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA1.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A2.cppm -emit-module-interface -o %t/A2.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA2.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A3.cppm -emit-module-interface -o %t/A3.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA3.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
|
|
// Test again with reduced BMI.
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-reduced-module-interface -o %t/A.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/A0.cppm -emit-reduced-module-interface -o %t/A0.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A1.cppm -emit-reduced-module-interface -o %t/A1.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA1.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A2.cppm -emit-reduced-module-interface -o %t/A2.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA2.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A3.cppm -emit-reduced-module-interface -o %t/A3.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/TestA3.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
|
|
|
|
//--- A.h
|
|
template <class _Tp>
|
|
concept A = requires(const _Tp& __t) { []<class __Up>(const __Up&) {}(__t); };
|
|
|
|
//--- A1.h
|
|
template <class _Tp>
|
|
concept A = requires(const _Tp& __t) { []<class __Up>(__Up) {}(__t); };
|
|
|
|
//--- A2.h
|
|
template <class _Tp>
|
|
concept A = requires(const _Tp& __t) { []<class __Up>(const __Up& __u) {
|
|
(int)__u;
|
|
}(__t); };
|
|
|
|
//--- A3.h
|
|
template <class _Tp>
|
|
concept A = requires(const _Tp& __t) { [t = '?']<class __Up>(const __Up&) {
|
|
(int)t;
|
|
}(__t); };
|
|
|
|
//--- A.cppm
|
|
module;
|
|
#include "A.h"
|
|
export module A;
|
|
export using ::A;
|
|
|
|
//--- A0.cppm
|
|
module;
|
|
#include "A.h"
|
|
export module A0;
|
|
export using ::A;
|
|
|
|
//--- TestA.cpp
|
|
// expected-no-diagnostics
|
|
import A;
|
|
import A0;
|
|
|
|
template <class C>
|
|
void f(C) requires(A<C>) {}
|
|
|
|
//--- A1.cppm
|
|
module;
|
|
#include "A1.h"
|
|
export module A1;
|
|
export using ::A;
|
|
|
|
//--- TestA1.cpp
|
|
import A;
|
|
import A1;
|
|
|
|
template <class C>
|
|
void f(C) requires(A<C>) {} // expected-error 1+{{reference to 'A' is ambiguous}}
|
|
// expected-note@* 1+{{candidate found by name lookup is 'A'}}
|
|
|
|
//--- A2.cppm
|
|
module;
|
|
#include "A2.h"
|
|
export module A2;
|
|
export using ::A;
|
|
|
|
//--- TestA2.cpp
|
|
import A;
|
|
import A2;
|
|
|
|
template <class C>
|
|
void f(C) requires(A<C>) {} // expected-error 1+{{reference to 'A' is ambiguous}}
|
|
// expected-note@* 1+{{candidate found by name lookup is 'A'}}
|
|
|
|
//--- A3.cppm
|
|
module;
|
|
#include "A3.h"
|
|
export module A3;
|
|
export using ::A;
|
|
|
|
//--- TestA3.cpp
|
|
import A;
|
|
import A3;
|
|
|
|
template <class C>
|
|
void f(C) requires(A<C>) {} // expected-error 1+{{reference to 'A' is ambiguous}}
|
|
// expected-note@* 1+{{candidate found by name lookup is 'A'}}
|