brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · d0317b9 Raw
69 lines · cpp
1// RUN: rm -rf %t2// RUN: mkdir -p %t3// RUN: split-file %s %t4//5// RUN: %clang_cc1 -std=c++23 %t/A.cppm -emit-module-interface -o %t/A.pcm6// RUN: %clang_cc1 -std=c++23 %t/Use.cpp -fprebuilt-module-path=%t -fsyntax-only -verify7 8// RUN: %clang_cc1 -std=c++23 %t/A.cppm -emit-reduced-module-interface -o %t/A.pcm9// RUN: %clang_cc1 -std=c++23 %t/Use.cpp -fprebuilt-module-path=%t -fsyntax-only -verify10 11//--- A.cppm12module;13export module A;14 15struct B {};16 17export template<int N> struct A : B {18  friend constexpr const int *f(B) requires true {19    static constexpr int result = N;20    return &result;21  }22 23  template<int M>24  friend constexpr const int *g(B) requires (M >= 0) && (N >= 0) {25    static constexpr int result = M * 10 + N;26    return &result;27  }28};29 30export inline A<1> a1;31export inline A<2> a2;32export inline A<3> a3;33 34static_assert(f(a1) != f(a2) && f(a2) != f(a3));35static_assert(g<1>(a1) != g<1>(a2) && g<1>(a2) != g<1>(a3));36 37static_assert(*f(a1) == 1);38static_assert(*f(a2) == 2);39static_assert(*f(a3) == 3);40 41static_assert(*g<4>(a1) == 41);42static_assert(*g<5>(a2) == 52);43static_assert(*g<6>(a3) == 63);44 45//--- Use.cpp46// expected-no-diagnostics47import A;48 49// Try some instantiations we tried before and some we didn't.50static_assert(f(a1) != f(a2) && f(a2) != f(a3));51static_assert(g<1>(a1) != g<1>(a2) && g<1>(a2) != g<1>(a3));52static_assert(g<2>(a1) != g<2>(a2) && g<2>(a2) != g<2>(a3));53 54A<4> a4;55static_assert(f(a1) != f(a4) && f(a2) != f(a4) && f(a3) != f(a4));56static_assert(g<3>(a1) != g<3>(a4));57 58static_assert(*f(a1) == 1);59static_assert(*f(a2) == 2);60static_assert(*f(a3) == 3);61static_assert(*f(a4) == 4);62 63static_assert(*g<4>(a1) == 41);64static_assert(*g<5>(a2) == 52);65static_assert(*g<6>(a3) == 63);66 67static_assert(*g<7>(a1) == 71);68static_assert(*g<8>(a4) == 84);69