From 3225b9c9b35056f15b967bda1f1d8a3ca1680a42 Mon Sep 17 00:00:00 2001 From: Serge Pavlov Date: Sat, 14 Sep 2013 12:00:01 +0000 Subject: [PATCH] Avoid getting an argument of allocation function if it does not exist. This is a fix to PR12778: in erroneous code an allocation function can be declared with no arguments, quering the first argument in this case causes assertion violation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190751 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprCXX.cpp | 23 ++++++++++++----------- test/SemaCXX/PR12778.cpp | 7 +++++++ 2 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 test/SemaCXX/PR12778.cpp diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 9b703ed098..f0417f7249 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1948,22 +1948,23 @@ void Sema::DeclareGlobalAllocationFunction(DeclarationName Name, DeclContext *GlobalCtx = Context.getTranslationUnitDecl(); // Check if this function is already declared. - { - DeclContext::lookup_result R = GlobalCtx->lookup(Name); - for (DeclContext::lookup_iterator Alloc = R.begin(), AllocEnd = R.end(); - Alloc != AllocEnd; ++Alloc) { - // Only look at non-template functions, as it is the predefined, - // non-templated allocation function we are trying to declare here. - if (FunctionDecl *Func = dyn_cast(*Alloc)) { + DeclContext::lookup_result R = GlobalCtx->lookup(Name); + for (DeclContext::lookup_iterator Alloc = R.begin(), AllocEnd = R.end(); + Alloc != AllocEnd; ++Alloc) { + // Only look at non-template functions, as it is the predefined, + // non-templated allocation function we are trying to declare here. + if (FunctionDecl *Func = dyn_cast(*Alloc)) { + if (Func->getNumParams() == 1) { QualType InitialParamType = Context.getCanonicalType( Func->getParamDecl(0)->getType().getUnqualifiedType()); // FIXME: Do we need to check for default arguments here? - if (Func->getNumParams() == 1 && InitialParamType == Argument) { + if (InitialParamType == Argument) { if (AddMallocAttr && !Func->hasAttr()) - Func->addAttr(::new (Context) MallocAttr(SourceLocation(), Context)); - // Make the function visible to name lookup, even if we found it in an - // unimported module. It either is an implicitly-declared global + Func->addAttr(::new (Context) MallocAttr(SourceLocation(), + Context)); + // Make the function visible to name lookup, even if we found it in + // an unimported module. It either is an implicitly-declared global // allocation function, or is suppressing that function. Func->setHidden(false); return; diff --git a/test/SemaCXX/PR12778.cpp b/test/SemaCXX/PR12778.cpp new file mode 100644 index 0000000000..f4d25f3e8f --- /dev/null +++ b/test/SemaCXX/PR12778.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +void operator delete() throw(void*); // expected-error{{'operator delete' must have at least one parameter}} +void* allocate(int __n) { + return ::operator new(__n); +} + -- 2.40.0