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