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