зеркало из https://github.com/microsoft/clang-1.git
When tree-transforming an expression sequence, always flag expanded
variadic argument pack expansions as having changed, rather than doing it for each changed expansion, which leaves out zero-argument packs with catastrophic consequences. Fixes PR10260. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134483 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
9dc71d2fdd
Коммит
c8fc90a854
|
@ -1547,9 +1547,9 @@ public:
|
|||
/// By default, performs semantic analysis to build the new expression.
|
||||
/// Subclasses may override this routine to provide different behavior.
|
||||
ExprResult RebuildInitList(SourceLocation LBraceLoc,
|
||||
MultiExprArg Inits,
|
||||
SourceLocation RBraceLoc,
|
||||
QualType ResultTy) {
|
||||
MultiExprArg Inits,
|
||||
SourceLocation RBraceLoc,
|
||||
QualType ResultTy) {
|
||||
ExprResult Result
|
||||
= SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
|
||||
if (Result.isInvalid() || ResultTy->isDependentType())
|
||||
|
@ -2477,6 +2477,10 @@ bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
|
|||
continue;
|
||||
}
|
||||
|
||||
// Record right away that the argument was changed. This needs
|
||||
// to happen even if the array expands to nothing.
|
||||
if (ArgChanged) *ArgChanged = true;
|
||||
|
||||
// The transform has determined that we should perform an elementwise
|
||||
// expansion of the pattern. Do so.
|
||||
for (unsigned I = 0; I != *NumExpansions; ++I) {
|
||||
|
@ -2492,8 +2496,6 @@ bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (ArgChanged)
|
||||
*ArgChanged = true;
|
||||
Outputs.push_back(Out.get());
|
||||
}
|
||||
|
||||
|
|
|
@ -9,4 +9,15 @@ int get_num_types(Types...) {
|
|||
// CHECK: ret i32 3
|
||||
template int get_num_types(int, float, double);
|
||||
|
||||
// PR10260 - argument packs that expand to nothing
|
||||
namespace test1 {
|
||||
template <class... T> void foo() {
|
||||
int values[sizeof...(T)+1] = { T::value... };
|
||||
// CHECK: define linkonce_odr void @_ZN5test13fooIJEEEvv()
|
||||
// CHECK: alloca [1 x i32], align 4
|
||||
}
|
||||
|
||||
void test() {
|
||||
foo<>();
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче