1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify %s
// RUN: %clang_cc1 -verify=ref %s
constexpr int a = 10;
constexpr const int &b = a;
static_assert(a == b, "");
constexpr int assignToReference() {
int a = 20;
int &b = a;
b = 100;
return a;
}
static_assert(assignToReference() == 100, "");
constexpr void setValue(int &dest, int val) {
dest = val;
}
constexpr int checkSetValue() {
int l = 100;
setValue(l, 200);
return l;
}
static_assert(checkSetValue() == 200, "");
constexpr int readLocalRef() {
int a = 20;
int &b = a;
return b;
}
static_assert(readLocalRef() == 20, "");
constexpr int incRef() {
int a = 0;
int &b = a;
b = b + 1;
return a;
}
static_assert(incRef() == 1, "");
template<const int &V>
constexpr void Plus3(int &A) {
A = V + 3;
}
constexpr int foo = 4;
constexpr int callTemplate() {
int a = 3;
Plus3<foo>(a);
return a;
}
static_assert(callTemplate() == 7, "");
constexpr int& getValue(int *array, int index) {
return array[index];
}
constexpr int testGetValue() {
int values[] = {1, 2, 3, 4};
getValue(values, 2) = 30;
return values[2];
}
static_assert(testGetValue() == 30, "");
constexpr const int &MCE = 20;
static_assert(MCE == 20, "");
static_assert(MCE == 30, ""); // expected-error {{static assertion failed}} \
// expected-note {{evaluates to '20 == 30'}} \
// ref-error {{static assertion failed}} \
// ref-note {{evaluates to '20 == 30'}}
constexpr int LocalMCE() {
const int &m = 100;
return m;
}
static_assert(LocalMCE() == 100, "");
static_assert(LocalMCE() == 200, ""); // expected-error {{static assertion failed}} \
// expected-note {{evaluates to '100 == 200'}} \
// ref-error {{static assertion failed}} \
// ref-note {{evaluates to '100 == 200'}}
struct S {
int i, j;
};
constexpr int RefToMemberExpr() {
S s{1, 2};
int &j = s.i;
j = j + 10;
return j;
}
static_assert(RefToMemberExpr() == 11, "");
struct Ref {
int &a;
};
constexpr int RecordWithRef() {
int m = 100;
Ref r{m};
m = 200;
return r.a;
}
static_assert(RecordWithRef() == 200, "");
struct Ref2 {
int &a;
constexpr Ref2(int &a) : a(a) {}
};
constexpr int RecordWithRef2() {
int m = 100;
Ref2 r(m);
m = 200;
return r.a;
}
static_assert(RecordWithRef2() == 200, "");
|