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