llvm-capstone/clang/test/SemaCXX/constexpr-default-arg.cpp
Akira Hatanaka 4e2698ca9e [ExprConstant] Use an AST node and a version number as a key to create
an APValue and retrieve it from map Temporaries.

The version number is needed when a single AST node is visited multiple
times and is used to create APValues that are required to be distinct
from each other (for example, MaterializeTemporaryExprs in default
arguments and VarDecls in loops).

rdar://problem/36505742

Differential Revision: https://reviews.llvm.org/D42776

llvm-svn: 329671
2018-04-10 05:15:01 +00:00

39 lines
1.1 KiB
C++

// 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-warning {{binding reference member}} // expected-note {{reference member declared here}}
struct B { A x, y; };
B b = {};
}