mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
8aa561ba32
If, during the initial parse of a template, we perform aggregate initialization and form an implicit value initialization for an array type, then when we come to instantiate the template and redo the initialization step, we would try to match the implicit value initialization up against an array *element*, not to the complete array. Remarkably, we've had this bug since ~the dawn of time, but only noticed it recently. llvm-svn: 213332
68 lines
1.1 KiB
C++
68 lines
1.1 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
// expected-no-diagnostics
|
|
|
|
// PR5426 - the non-dependent obj would be fully processed and wrapped in a
|
|
// CXXConstructExpr at definition time, which would lead to a failure at
|
|
// instantiation time.
|
|
struct arg {
|
|
arg();
|
|
};
|
|
|
|
struct oldstylemove {
|
|
oldstylemove(oldstylemove&);
|
|
oldstylemove(const arg&);
|
|
};
|
|
|
|
template <typename T>
|
|
void fn(T t, const arg& arg) {
|
|
oldstylemove obj(arg);
|
|
}
|
|
|
|
void test() {
|
|
fn(1, arg());
|
|
}
|
|
|
|
struct X0 { };
|
|
|
|
struct X1 {
|
|
explicit X1(const X0 &x0 = X0());
|
|
};
|
|
|
|
template<typename T>
|
|
void f0() {
|
|
X1 x1;
|
|
}
|
|
|
|
template void f0<int>();
|
|
template void f0<float>();
|
|
|
|
struct NonTrivial {
|
|
NonTrivial();
|
|
~NonTrivial();
|
|
};
|
|
|
|
template<int N> void f1() {
|
|
NonTrivial array[N];
|
|
}
|
|
template<> void f1<2>();
|
|
|
|
namespace PR20346 {
|
|
struct S { short inner_s; };
|
|
|
|
struct outer_struct {
|
|
wchar_t arr[32];
|
|
S outer_s;
|
|
};
|
|
|
|
template <class T>
|
|
void OpenFileSession() {
|
|
// Ensure that we don't think the ImplicitValueInitExpr generated here
|
|
// during the initial parse only initializes the first array element!
|
|
outer_struct asdfasdf = {};
|
|
};
|
|
|
|
void foo() {
|
|
OpenFileSession<int>();
|
|
}
|
|
}
|