Make sure that out-of-line function and variable definitions are not

pushed into scope. Fixes PR5056.

llvm-svn: 83003
This commit is contained in:
Douglas Gregor 2009-09-28 18:41:37 +00:00
parent 21c0774ba9
commit 5ad7c54bb9
2 changed files with 27 additions and 2 deletions

View File

@ -288,14 +288,22 @@ void Sema::PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext) {
((DeclContext *)S->getEntity())->isTransparentContext())
S = S->getParent();
S->AddDecl(DeclPtrTy::make(D));
// Add scoped declarations into their context, so that they can be
// found later. Declarations without a context won't be inserted
// into any context.
if (AddToContext)
CurContext->addDecl(D);
// Out-of-line function and variable definitions should not be pushed into
// scope.
if ((isa<FunctionTemplateDecl>(D) &&
cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->isOutOfLine()) ||
(isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isOutOfLine()) ||
(isa<VarDecl>(D) && cast<VarDecl>(D)->isOutOfLine()))
return;
S->AddDecl(DeclPtrTy::make(D));
// C++ [basic.scope]p4:
// -- exactly one declaration shall declare a class name or
// enumeration name that is not a typedef name and the other

View File

@ -0,0 +1,17 @@
// RUN: clang-cc -fsyntax-only -verify %s
extern "C" void * malloc(int);
template <typename T> struct A {
void *malloc(int);
};
template <typename T>
inline void *A<T>::malloc(int)
{
return 0;
}
void f() {
malloc(10);
}