|  | // 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}: |