xref: /llvm-project/clang/test/AST/ByteCode/depth-limit.cpp (revision a07aba5d44204a7ca0d891a3da05af9960081e4c)
1*a07aba5dSTimm Baeder // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fconstexpr-depth=100 -verify %s
2*a07aba5dSTimm Baeder // RUN: %clang_cc1 -fconstexpr-depth=100 -verify=ref %s
3*a07aba5dSTimm Baeder 
4*a07aba5dSTimm Baeder constexpr int f(int a) {
5*a07aba5dSTimm Baeder   if (a == 100)
6*a07aba5dSTimm Baeder     return 1 / 0; // expected-warning {{division by zero is undefined}} \
7*a07aba5dSTimm Baeder                   // ref-warning {{division by zero is undefined}}
8*a07aba5dSTimm Baeder 
9*a07aba5dSTimm Baeder   return f(a + 1); // ref-note {{exceeded maximum depth of 100 calls}} \
10*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(99)'}} \
11*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(98)'}} \
12*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(97)'}} \
13*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(96)'}} \
14*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(95)'}} \
15*a07aba5dSTimm Baeder                    // ref-note {{skipping 90 calls in backtrace}} \
16*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(4)'}} \
17*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(3)'}} \
18*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(2)'}} \
19*a07aba5dSTimm Baeder                    // ref-note {{in call to 'f(1)'}} \
20*a07aba5dSTimm Baeder                    // expected-note {{exceeded maximum depth of 100 calls}} \
21*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(99)'}} \
22*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(98)'}} \
23*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(97)'}} \
24*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(96)'}} \
25*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(95)'}} \
26*a07aba5dSTimm Baeder                    // expected-note {{skipping 90 calls in backtrace}} \
27*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(4)'}} \
28*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(3)'}} \
29*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(2)'}} \
30*a07aba5dSTimm Baeder                    // expected-note {{in call to 'f(1)'}}
31*a07aba5dSTimm Baeder }
32*a07aba5dSTimm Baeder static_assert(f(0) == 100, ""); // ref-error {{not an integral constant expression}} \
33*a07aba5dSTimm Baeder                                 // ref-note {{in call to 'f(0)'}} \
34*a07aba5dSTimm Baeder                                 // expected-error {{not an integral constant expression}} \
35*a07aba5dSTimm Baeder                                 // expected-note {{in call to 'f(0)'}}
36