From: Hans Wennborg Date: Sat, 31 May 2014 01:30:30 +0000 (+0000) Subject: Make Attr::Clone() also clone the Inherited, IsPackExpansion and Implicit flags X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ffc3500bc9d543821fb35aa8dec0232e52d8e6c1;p=clang Make Attr::Clone() also clone the Inherited, IsPackExpansion and Implicit flags I was bitten by this when working with the dll attributes: when a dll attribute was cloned from a class template declaration to its specialization, the Inherited flag didn't get cloned. Differential Revision: http://reviews.llvm.org/D3972 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209950 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp index 2f58099e5c..c03ff901d1 100644 --- a/utils/TableGen/ClangAttrEmitter.cpp +++ b/utils/TableGen/ClangAttrEmitter.cpp @@ -1553,12 +1553,16 @@ void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) { OS << R.getName() << "Attr *" << R.getName() << "Attr::clone(ASTContext &C) const {\n"; - OS << " return new (C) " << R.getName() << "Attr(getLocation(), C"; + OS << " auto *A = new (C) " << R.getName() << "Attr(getLocation(), C"; for (auto const &ai : Args) { OS << ", "; ai->writeCloneArgs(OS); } - OS << ", getSpellingListIndex());\n}\n\n"; + OS << ", getSpellingListIndex());\n"; + OS << " A->Inherited = Inherited;\n"; + OS << " A->IsPackExpansion = IsPackExpansion;\n"; + OS << " A->Implicit = Implicit;\n"; + OS << " return A;\n}\n\n"; writePrettyPrintFunction(R, Args, OS); writeGetSpellingFunction(R, OS);