1 // RUN: not %clang_cc1 -std=c++11 -fsyntax-only %s -fconstexpr-backtrace-limit 0 -fconstexpr-depth 4 -fno-caret-diagnostics 2>&1 | FileCheck %s -check-prefix=TEST1 2 // TEST1: constant expression 3 // TEST1-NEXT: exceeded maximum depth of 4 4 // TEST1-NEXT: in call to 'recurse(2)' 5 // TEST1-NEXT: in call to 'recurse(3)' 6 // TEST1-NEXT: in call to 'recurse(4)' 7 // TEST1-NEXT: in call to 'recurse(5)' 8 9 // RUN: not %clang_cc1 -std=c++11 -fsyntax-only %s -fconstexpr-backtrace-limit 2 -fconstexpr-depth 4 -fno-caret-diagnostics 2>&1 | FileCheck %s -check-prefix=TEST2 10 // TEST2: constant expression 11 // TEST2-NEXT: exceeded maximum depth of 4 12 // TEST2-NEXT: in call to 'recurse(2)' 13 // TEST2-NEXT: skipping 2 calls 14 // TEST2-NEXT: in call to 'recurse(5)' 15 16 // RUN: not %clang_cc1 -std=c++11 -fsyntax-only %s -fconstexpr-backtrace-limit 2 -fconstexpr-depth 8 -fno-caret-diagnostics 2>&1 | FileCheck %s -check-prefix=TEST3 17 // TEST3: constant expression 18 // TEST3-NEXT: reinterpret_cast 19 // TEST3-NEXT: in call to 'recurse(0)' 20 // TEST3-NEXT: skipping 4 calls 21 // TEST3-NEXT: in call to 'recurse(5)' 22 23 // RUN: not %clang_cc1 -std=c++11 -fsyntax-only %s -fconstexpr-backtrace-limit 8 -fconstexpr-depth 8 -fno-caret-diagnostics 2>&1 | FileCheck %s -check-prefix=TEST4 24 // TEST4: constant expression 25 // TEST4-NEXT: reinterpret_cast 26 // TEST4-NEXT: in call to 'recurse(0)' 27 // TEST4-NEXT: in call to 'recurse(1)' 28 // TEST4-NEXT: in call to 'recurse(2)' 29 // TEST4-NEXT: in call to 'recurse(3)' 30 // TEST4-NEXT: in call to 'recurse(4)' 31 // TEST4-NEXT: in call to 'recurse(5)' 32 33 constexpr int recurse(int n) { return n ? recurse(n-1) : *(int*)n; } 34 static_assert(recurse(5), ""); 35