brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 1b19a7a Raw
96 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify=ref,both %s2// RUN: %clang_cc1 -std=c++20 -fexperimental-new-constant-interpreter -fsyntax-only -verify=expected,both %s3 4 5struct Foo {6    constexpr void zomg() const { (void)(1 / 0); } // both-error {{constant expression}} \7                                                      both-warning {{division by zero}} \8                                                      both-note 2{{division by zero}}9};10 11struct S {12    constexpr S() {}13    constexpr bool operator==(const S&) const { // both-error {{never produces a constant expression}}14      return 1 / 0; // both-warning {{division by zero}} \15                       both-note 3{{division by zero}}16    }17 18    constexpr bool heh() const {19        auto F = new Foo();20        F->zomg(); // both-note {{in call to 'F->zomg()'}}21        delete F;22        return false;23    }24};25 26constexpr S s;27 28static_assert(s.heh()); // both-error {{constant expression}} \29                           both-note {{in call to 's.heh()'}}30 31constexpr S s2;32constexpr const S *sptr = &s;33constexpr const S *sptr2 = &s2;34static_assert(s == s2); // both-error {{constant expression}} \35                           both-note {{in call to 's.operator==(s2)'}}36static_assert(*sptr == *sptr2); // both-error {{constant expression}} \37                                   both-note {{in call to '*sptr.operator==(s2)'}}38 39struct A {40  constexpr int foo() { (void)(1/0); return 1;} // both-error {{never produces a constant expression}} \41                                                   both-warning {{division by zero}} \42                                                   both-note 2{{division by zero}}43};44 45struct B {46  A aa;47  A *a = &aa;48};49 50struct C {51  B b;52};53 54struct D {55  C cc;56  C *c = &cc;57};58 59constexpr D d{};60static_assert(d.c->b.a->foo() == 1); // both-error {{constant expression}} \61                                        both-note {{in call to 'd.c->b.a->foo()'}}62 63template <typename T>64struct Bar {65  template <typename U>66  constexpr int fail1() const { return 1 / 0; } // both-warning {{division by zero}} \67                                                // both-note {{division by zero}}68  template <typename U, int num>69  constexpr int fail2() const { return 1 / 0; } // both-warning {{division by zero}} \70                                                // both-note {{division by zero}}71  template <typename ...Args>72  constexpr int fail3(Args... args) const { return 1 / 0; } // both-warning {{division by zero}} \73                                                // both-note {{division by zero}}74};75 76constexpr Bar<int> bar;77static_assert(bar.fail1<int>()); // both-error {{constant expression}} \78                                 // both-note {{in call to 'bar.fail1<int>()'}}79static_assert(bar.fail2<int*, 42>()); // both-error {{constant expression}} \80                                      // both-note {{in call to 'bar.fail2<int *, 42>()'}}81static_assert(bar.fail3(3, 4UL, bar, &bar)); // both-error {{constant expression}} \82                                             // both-note {{in call to 'bar.fail3<int, unsigned long, Bar<int>, const Bar<int> *>(3, 4, {}, &bar)'}}83 84 85 86struct MemPtrTest {87  int n;88  void f();89};90MemPtrTest mpt; // both-note {{here}}91constexpr int MemPtr(int (MemPtrTest::*a), void (MemPtrTest::*b)(), int &c) {92  return c; // both-note {{read of non-constexpr variable 'mpt'}}93}94static_assert(MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.*&MemPtrTest::n), ""); // both-error {{constant expression}} \95                                                                                // both-note {{in call to 'MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.n)'}}96