On Wed, Nov 5, 2014 at 1:50 PM, Fariborz Jahanian <[email protected]> wrote:
> Author: fjahanian > Date: Wed Nov 5 15:50:22 2014 > New Revision: 221404 > > URL: http://llvm.org/viewvc/llvm-project?rev=221404&view=rev > Log: > This patch fixes a crash after rebuilding call AST of > an __unknown_anytype(...). In this case, we rebuild the > vararg function type specially to convert the call expression > to something that IRGen can handle. However, FunctionDecl > as rebuilt in RebuildUnknownAnyExpr::resolveDecl is bogus and > results in crash when accessing its params later on. This > patch fixes the crash by rebuilding the FunctionDecl to match > its new resolved type. rdar://15297105. > John McCall, please review post-commit. > > Modified: > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/test/CodeGenCXX/unknown-anytype.cpp > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=221404&r1=221403&r2=221404&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Nov 5 15:50:22 2014 > @@ -13343,6 +13343,39 @@ ExprResult RebuildUnknownAnyExpr::resolv > << VD << E->getSourceRange(); > return ExprError(); > } > + if (const FunctionProtoType *FT = Type->getAs<FunctionProtoType>()) { > + // We must match the FunctionDecl's type to the hack introduced in > + // RebuildUnknownAnyExpr::VisitCallExpr to vararg functions of > unknown > + // type. See the lengthy commentary in that routine. > + QualType FDT = FD->getType(); > + const FunctionType *FnType = FDT->castAs<FunctionType>(); > + const FunctionProtoType *Proto = > dyn_cast_or_null<FunctionProtoType>(FnType); > + DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E); > + if (DRE && Proto && Proto->getParamTypes().empty() && > Proto->isVariadic()) { > + SourceLocation Loc = FD->getLocation(); > + FunctionDecl *NewFD = FunctionDecl::Create(FD->getASTContext(), > + FD->getDeclContext(), > + Loc, Loc, > FD->getNameInfo().getName(), > + DestType, FD->getTypeSourceInfo(), > + SC_None, false/*isInlineSpecified*/, > + FD->hasPrototype(), > + false/*isConstexprSpecified*/); > + > + if (FD->getQualifier()) > + NewFD->setQualifierInfo(FD->getQualifierLoc()); > + > + SmallVector<ParmVarDecl*, 16> Params; > + for (const auto &AI : FT->param_types()) { > + ParmVarDecl *Param = > + S.BuildParmVarDeclForTypedef(FD, Loc, AI); > + Param->setScopeInfo(0, Params.size()); > + Params.push_back(Param); > + } > + NewFD->setParams(Params); > + DRE->setDecl(NewFD); > + VD = DRE->getDecl(); > + } > + } > > if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) > if (MD->isInstance()) { > > Modified: cfe/trunk/test/CodeGenCXX/unknown-anytype.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/unknown-anytype.cpp?rev=221404&r1=221403&r2=221404&view=diff > > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/unknown-anytype.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/unknown-anytype.cpp Wed Nov 5 15:50:22 2014 > @@ -115,3 +115,9 @@ extern "C" __unknown_anytype test10_any( > void test10() { > (void) test10_any(), (void) test10_any(); > } > + > +extern "C" __unknown_anytype malloc(...); > +void test11() { > + void *s = (void*)malloc(12); > + void *d = (void*)malloc(435); > +} > Is there some output that should be tested here - a test that is simply "this does not crash" is kind of uninteresting & usually telling of some missing test coverage (if the program was crashing before and doesn't crash after, presumably there's some specific behavior that's desired beyond "anything other than crashing"). > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
