From 9bedef6ae106f94b2edd3ec19bd5927d390d4fa4 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 14 Jul 2009 03:18:53 +0000 Subject: [PATCH] Fixes for a couple of things: - Declaration context of ParmVarDecls (that we got from the Declarator) was not their containing function. - C++ out-of-line method definitions didn't get an access specifier. Both were exposed by a crash when emitting a C++ method to a PCH file (assert at Decl::CheckAccessDeclContext()). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75597 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 13 ++++++++++--- test/PCH/cxx-method.cpp | 7 +++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 test/PCH/cxx-method.cpp diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 3ce11570fe..c1dcdd6ec0 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2298,8 +2298,12 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, Diag(Param->getLocation(), diag::err_param_typedef_of_void); // FIXME: Leaks decl? } else if (FTI.NumArgs > 0 && FTI.ArgInfo[0].Param != 0) { - for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) - Params.push_back(FTI.ArgInfo[i].Param.getAs()); + for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) { + ParmVarDecl *Param = FTI.ArgInfo[i].Param.getAs(); + assert(Param->getDeclContext() != NewFD && "Was set before ?"); + Param->setDeclContext(NewFD); + Params.push_back(Param); + } } } else if (const FunctionProtoType *FT = R->getAsFunctionProtoType()) { @@ -2546,8 +2550,11 @@ void Sema::CheckFunctionDeclaration(FunctionDecl *NewFD, NamedDecl *&PrevDecl, if (FunctionTemplateDecl *OldTemplateDecl = dyn_cast(OldDecl)) NewFD->setPreviousDeclaration(OldTemplateDecl->getTemplatedDecl()); - else + else { + if (isa(NewFD)) // Set access for out-of-line definitions + NewFD->setAccess(OldDecl->getAccess()); NewFD->setPreviousDeclaration(cast(OldDecl)); + } } } diff --git a/test/PCH/cxx-method.cpp b/test/PCH/cxx-method.cpp new file mode 100644 index 0000000000..144406e7bd --- /dev/null +++ b/test/PCH/cxx-method.cpp @@ -0,0 +1,7 @@ +// RUN: clang-cc -emit-pch %s -o %t + +struct S { + void m(int x); +}; + +void S::m(int x) { } -- 2.50.1