1 | // RUN: %clang_cc1 -std=c++1y -S -o - -emit-llvm -verify %s |
2 | |
3 | namespace default_arg_temporary { |
4 | |
5 | constexpr bool equals(const float& arg = 1.0f) { |
6 | return arg == 1.0f; |
7 | } |
8 | |
9 | constexpr const int &x(const int &p = 0) { |
10 | return p; |
11 | } |
12 | |
13 | struct S { |
14 | constexpr S(const int &a = 0) {} |
15 | }; |
16 | |
17 | void test_default_arg2() { |
18 | // This piece of code used to cause an assertion failure in |
19 | // CallStackFrame::createTemporary because the same MTE is used to initilize |
20 | // both elements of the array (see PR33140). |
21 | constexpr S s[2] = {}; |
22 | |
23 | // This piece of code used to cause an assertion failure in |
24 | // CallStackFrame::createTemporary because multiple CXXDefaultArgExpr share |
25 | // the same MTE (see PR33140). |
26 | static_assert(equals() && equals(), ""); |
27 | |
28 | // Test that constant expression evaluation produces distinct lvalues for |
29 | // each call. |
30 | static_assert(&x() != &x(), ""); |
31 | } |
32 | |
33 | // Check that multiple CXXDefaultInitExprs don't cause an assertion failure. |
34 | struct A { int &&r = 0; }; // expected-note 2{{default member initializer}} |
35 | struct B { A x, y; }; |
36 | B b = {}; // expected-warning 2{{not supported}} |
37 | |
38 | } |
39 | |