diff --git a/clang/include/clang/AST/OpenACCClause.h b/clang/include/clang/AST/OpenACCClause.h index ab2bf0e08692c..613c03ce4ad64 100644 --- a/clang/include/clang/AST/OpenACCClause.h +++ b/clang/include/clang/AST/OpenACCClause.h @@ -1325,17 +1325,17 @@ class OpenACCReductionClause final Op(Operator) { assert(VarList.size() == Recipes.size()); setExprs(getTrailingObjects(VarList.size()), VarList); + llvm::uninitialized_copy(Recipes, + getTrailingObjects()); + } - // Initialize the recipe list. - unsigned I = 0; - for (const OpenACCReductionRecipe &R : Recipes) { - new (&getTrailingObjects()[I]) - OpenACCReductionRecipe(R); - ++I; +public: + ~OpenACCReductionClause() { + for (unsigned I = 0; I < getExprs().size(); ++I) { + getTrailingObjects()[I].~OpenACCReductionRecipe(); } } -public: static bool classof(const OpenACCClause *C) { return C->getClauseKind() == OpenACCClauseKind::Reduction; }