// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info -fcxx-exceptions %s 2>&1 | FileCheck %s // RUN: not %clang_cc1 -fsyntax-only -fexperimental-new-constant-interpreter -fdiagnostics-print-source-range-info -fcxx-exceptions %s 2>&1 | FileCheck %s constexpr int f() { throw 1; return 0; } // CHECK: constexpr-source-ranges.cpp:5:3:{5:3-5:10} constexpr int I = 12; constexpr const int *P = &I; constexpr long L = (long)P; // CHECK: constexpr-source-ranges.cpp:14:20:{14:20-14:27} constexpr int zero() { return 0; } constexpr int divByZero() { return 1 / zero(); } static_assert(divByZero() == 0, ""); /// We see this twice. Once from sema and once when /// evaluating the static_assert above. // CHECK: constexpr-source-ranges.cpp:23:15:{23:15-23:31} // CHECK: constexpr-source-ranges.cpp:21:12:{21:14-21:20} constexpr int div(bool a, bool b) { return 1 / (int)b; } constexpr int ints(int a, int b, int c, int d) { return 1; } static_assert(ints(1, div(true, false), 2, div(false, true)) == 1, ""); // CHECK: constexpr-source-ranges.cpp:35:23:{35:23-35:39} namespace overflow { // CHECK: :{[[@LINE+1]]:9-[[@LINE+1]]:29}: int x = -1 + __INT_MAX__ + 2 + 3; // CHECK: :{[[@LINE+1]]:9-[[@LINE+1]]:19}: int a = -(1 << 31) + 1; } constexpr int uninit() { int aaa; // CHECK: :{[[@LINE+1]]:10-[[@LINE+1]]:13}: return aaa; } static_assert(uninit() == 0, ""); constexpr void neverValid() { throw; } // CHECK: :{[[@LINE-1]]:16-[[@LINE-1]]:26}: