diff options
| author | Alexis Hunt <alercah@gmail.com> | 2011-05-06 20:44:56 +0000 | 
|---|---|---|
| committer | Alexis Hunt <alercah@gmail.com> | 2011-05-06 20:44:56 +0000 | 
| commit | 4a8ea1092abe14eb8e837e2a080b74c958213cd4 (patch) | |
| tree | fa15f407674a846c0f26a4036b6836c441fc78b9 /clang/lib/AST | |
| parent | 2518f8376d7dcaa28e17c96a34bdd9e0f389cd11 (diff) | |
| download | bcm5719-llvm-4a8ea1092abe14eb8e837e2a080b74c958213cd4.tar.gz bcm5719-llvm-4a8ea1092abe14eb8e837e2a080b74c958213cd4.zip  | |
Modify some deleted function methods to better reflect reality:
 - New isDefined() function checks for deletedness
 - isThisDeclarationADefinition checks for deletedness
 - New doesThisDeclarationHaveABody() does what
   isThisDeclarationADefinition() used to do
 - The IsDeleted bit is not propagated across redeclarations
 - isDeleted() now checks the canoncial declaration
 - New isDeletedAsWritten() does what it says on the tin.
 - isUserProvided() now correct (thanks Richard!)
This fixes the bug that we weren't catching
void foo() = delete;
void foo() {}
as being a redefinition.
llvm-svn: 131013
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/AST/DeclPrinter.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/DumpXML.cpp | 4 | 
4 files changed, 18 insertions, 7 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index a5ff6644490..07823e04081 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -6100,7 +6100,7 @@ bool ASTContext::DeclMustBeEmitted(const Decl *D) {    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {      // Forward declarations aren't required. -    if (!FD->isThisDeclarationADefinition()) +    if (!FD->doesThisDeclarationHaveABody())        return false;      // Constructors and destructors are required. diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index e336dd771a0..b57c6ab7d76 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1422,6 +1422,17 @@ bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const {    return false;  } +bool FunctionDecl::isDefined(const FunctionDecl *&Definition) const { +  for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { +    if (I->IsDeleted || I->Body || I->IsLateTemplateParsed) { +      Definition = I->IsDeleted ? I->getCanonicalDecl() : *I; +      return true; +    } +  } + +  return false; +} +  Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {    for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {      if (I->Body) { @@ -1690,7 +1701,7 @@ bool FunctionDecl::isInlined() const {  /// an externally visible symbol, but "extern inline" will not create an   /// externally visible symbol.  bool FunctionDecl::isInlineDefinitionExternallyVisible() const { -  assert(isThisDeclarationADefinition() && "Must have the function definition"); +  assert(doesThisDeclarationHaveABody() && "Must have the function definition");    assert(isInlined() && "Function must be inline");    ASTContext &Context = getASTContext(); diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 2fd88d7c808..49f27234c04 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -400,7 +400,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {          if (D->getNumParams()) POut << ", ";          POut << "...";        } -    } else if (D->isThisDeclarationADefinition() && !D->hasPrototype()) { +    } else if (D->doesThisDeclarationHaveABody() && !D->hasPrototype()) {        for (unsigned i = 0, e = D->getNumParams(); i != e; ++i) {          if (i)            Proto += ", "; @@ -518,9 +518,9 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {    if (D->isPure())      Out << " = 0"; -  else if (D->isDeleted()) +  else if (D->isDeletedAsWritten())      Out << " = delete"; -  else if (D->isThisDeclarationADefinition()) { +  else if (D->doesThisDeclarationHaveABody()) {      if (!D->hasPrototype() && D->getNumParams()) {        // This is a K&R function definition, so we need to print the        // parameters. diff --git a/clang/lib/AST/DumpXML.cpp b/clang/lib/AST/DumpXML.cpp index 8bb39ba470f..9bb3807c1d9 100644 --- a/clang/lib/AST/DumpXML.cpp +++ b/clang/lib/AST/DumpXML.cpp @@ -482,7 +482,7 @@ struct XMLDumper : public XMLDeclVisitor<XMLDumper>,      setFlag("trivial", D->isTrivial());      setFlag("returnzero", D->hasImplicitReturnZero());      setFlag("prototype", D->hasWrittenPrototype()); -    setFlag("deleted", D->isDeleted()); +    setFlag("deleted", D->isDeletedAsWritten());      if (D->getStorageClass() != SC_None)        set("storage",            VarDecl::getStorageClassSpecifierString(D->getStorageClass())); @@ -493,7 +493,7 @@ struct XMLDumper : public XMLDeclVisitor<XMLDumper>,      for (FunctionDecl::param_iterator             I = D->param_begin(), E = D->param_end(); I != E; ++I)        dispatch(*I); -    if (D->isThisDeclarationADefinition()) +    if (D->doesThisDeclarationHaveABody())        dispatch(D->getBody());    }  | 

