diff options
| author | Sam Weinig <sam.weinig@gmail.com> | 2009-12-28 03:19:38 +0000 |
|---|---|---|
| committer | Sam Weinig <sam.weinig@gmail.com> | 2009-12-28 03:19:38 +0000 |
| commit | b999f68ed9df3be5a6a2fc7ac5d6abc9fb3d9eca (patch) | |
| tree | 7f85a9c2b3328ded5e4095e0e4562d4e16a5b86a /clang/lib/AST/Decl.cpp | |
| parent | 0b00a1b54e09660e73a7c623fe03beeb2bfe52a5 (diff) | |
| download | bcm5719-llvm-b999f68ed9df3be5a6a2fc7ac5d6abc9fb3d9eca.tar.gz bcm5719-llvm-b999f68ed9df3be5a6a2fc7ac5d6abc9fb3d9eca.zip | |
Fix for PR5871. Make __PRETTY_FUNCTION__ work for member functions defined in a class local to a function.
llvm-svn: 92200
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 220b0fb1c7b..02a26d49f04 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -455,11 +455,6 @@ std::string NamedDecl::getQualifiedNameAsString(const PrintingPolicy &P) const { return getNameAsString(); while (Ctx) { - if (Ctx->isFunctionOrMethod()) - // FIXME: That probably will happen, when D was member of local - // scope class/struct/union. How do we handle this case? - break; - if (const ClassTemplateSpecializationDecl *Spec = dyn_cast<ClassTemplateSpecializationDecl>(Ctx)) { const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); @@ -483,6 +478,34 @@ std::string NamedDecl::getQualifiedNameAsString(const PrintingPolicy &P) const { } else { Names.push_back(RD->getNameAsString()); } + } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Ctx)) { + std::string Proto = FD->getNameAsString(); + + const FunctionProtoType *FT = 0; + if (FD->hasWrittenPrototype()) + FT = dyn_cast<FunctionProtoType>(FD->getType()->getAs<FunctionType>()); + + Proto += "("; + if (FT) { + llvm::raw_string_ostream POut(Proto); + unsigned NumParams = FD->getNumParams(); + for (unsigned i = 0; i < NumParams; ++i) { + if (i) + POut << ", "; + std::string Param; + FD->getParamDecl(i)->getType().getAsStringInternal(Param, P); + POut << Param; + } + + if (FT->isVariadic()) { + if (NumParams > 0) + POut << ", "; + POut << "..."; + } + } + Proto += ")"; + + Names.push_back(Proto); } else if (const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx)) Names.push_back(ND->getNameAsString()); else |

