r190751 - Avoid getting an argument of allocation function if it does not exist.
Serge Pavlov
sepavloff at gmail.com
Sat Sep 14 05:00:02 PDT 2013
Author: sepavloff
Date: Sat Sep 14 07:00:01 2013
New Revision: 190751
URL: http://llvm.org/viewvc/llvm-project?rev=190751&view=rev
Log:
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.
Added:
cfe/trunk/test/SemaCXX/PR12778.cpp
Modified:
cfe/trunk/lib/Sema/SemaExprCXX.cpp
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=190751&r1=190750&r2=190751&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sat Sep 14 07:00:01 2013
@@ -1948,22 +1948,23 @@ void Sema::DeclareGlobalAllocationFuncti
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<FunctionDecl>(*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<FunctionDecl>(*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<MallocAttr>())
- 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;
Added: cfe/trunk/test/SemaCXX/PR12778.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/PR12778.cpp?rev=190751&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/PR12778.cpp (added)
+++ cfe/trunk/test/SemaCXX/PR12778.cpp Sat Sep 14 07:00:01 2013
@@ -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);
+}
+
More information about the cfe-commits
mailing list