/// checkUndefinedInternals - Check for undefined objects with internal linkage. static void checkUndefinedInternals(Sema &S) { if (S.UndefinedInternals.empty()) return; // Collect all the still-undefined entities with internal linkage. SmallVector<UndefinedInternal, 16> undefined; for (llvm::MapVector<NamedDecl*,SourceLocation>::iterator i = S.UndefinedInternals.begin(), e = S.UndefinedInternals.end(); i != e; ++i) { NamedDecl *decl = i->first; // Ignore attributes that have become invalid. if (decl->isInvalidDecl()) continue; // If we found out that the decl is external, don't warn. if (decl->getLinkage() == ExternalLinkage) continue; // __attribute__((weakref)) is basically a definition. if (decl->hasAttr<WeakRefAttr>()) continue; if (FunctionDecl *fn = dyn_cast<FunctionDecl>(decl)) { if (fn->isPure() || fn->hasBody()) continue; } else { if (cast<VarDecl>(decl)->hasDefinition() != VarDecl::DeclarationOnly) continue; } S.Diag(decl->getLocation(), diag::warn_undefined_internal) << isa<VarDecl>(decl) << decl; S.Diag(i->second, diag::note_used_here); } }
/// checkUndefinedButUsed - Check for undefined objects with internal linkage /// or that are inline. static void checkUndefinedButUsed(Sema &S) { if (S.UndefinedButUsed.empty()) return; // Collect all the still-undefined entities with internal linkage. SmallVector<std::pair<NamedDecl *, SourceLocation>, 16> Undefined; S.getUndefinedButUsed(Undefined); if (Undefined.empty()) return; for (SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> >::iterator I = Undefined.begin(), E = Undefined.end(); I != E; ++I) { NamedDecl *ND = I->first; if (ND->getLinkage() != ExternalLinkage) { S.Diag(ND->getLocation(), diag::warn_undefined_internal) << isa<VarDecl>(ND) << ND; } else { assert(cast<FunctionDecl>(ND)->getMostRecentDecl()->isInlined() && "used object requires definition but isn't inline or internal?"); S.Diag(ND->getLocation(), diag::warn_undefined_inline) << ND; } if (I->second.isValid()) S.Diag(I->second, diag::note_used_here); } }