| // RUN: %clang_cc1 -std=c++1y -S -o - -emit-llvm -verify %s |
| |
| namespace default_arg_temporary { |
| |
| constexpr bool equals(const float& arg = 1.0f) { |
| return arg == 1.0f; |
| } |
| |
| constexpr const int &x(const int &p = 0) { |
| return p; |
| } |
| |
| struct S { |
| constexpr S(const int &a = 0) {} |
| }; |
| |
| void test_default_arg2() { |
| // This piece of code used to cause an assertion failure in |
| // CallStackFrame::createTemporary because the same MTE is used to initilize |
| // both elements of the array (see PR33140). |
| constexpr S s[2] = {}; |
| |
| // This piece of code used to cause an assertion failure in |
| // CallStackFrame::createTemporary because multiple CXXDefaultArgExpr share |
| // the same MTE (see PR33140). |
| static_assert(equals() && equals(), ""); |
| |
| // Test that constant expression evaluation produces distinct lvalues for |
| // each call. |
| static_assert(&x() != &x(), ""); |
| } |
| |
| // Check that multiple CXXDefaultInitExprs don't cause an assertion failure. |
| struct A { int &&r = 0; }; // expected-note 2{{default member initializer}} |
| struct B { A x, y; }; |
| B b = {}; // expected-warning 2{{not supported}} |
| |
| } |