The assertion fails when a function with a default argument that materializes a temporary is called more than once in an expression. The assertion fails in CallStackFrame::createTemporary when it searches map Temporaries using the default argument's expression (which is a MaterializeTemporaryExpr) as the key and it discovers that there is already an element with that key that has been initialized.
constexpr bool equals(const float& arg = 1.0f) { return arg == 1.0f; } constexpr bool test_default_arg() { return equals() && equals(); }
This patch removes the assertion and makes CallStackFrame::createTemporary reset the existing element and return it if the element is found in the map.
rdar://problem/36505742