diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-02-14 01:47:04 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-02-14 01:47:04 +0000 |
commit | d2fdd4256a2efc41365ccdd27a210d1d99a1fe3a (patch) | |
tree | 806a23fc44c70cd99e6316463c8e25362d3abdbd /lib/AST/Decl.cpp | |
parent | 950fee2555f7a6bd193e588d6b6a941fd182391a (diff) |
merge hasCLanguageLinkage and isExternC. Keep the shorter name.
I added hasCLanguageLinkage while fixing some language linkage bugs some
time ago so that I wouldn't have to check all users of isExternC. It turned
out to be a much longer detour than expected, but this patch finally
merges the two again. The isExternC function now implements just the
standard notion of having C language linkage.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175119 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 52 |
1 files changed, 10 insertions, 42 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 5c489273d2..433e76767c 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1217,20 +1217,20 @@ SourceRange VarDecl::getSourceRange() const { template<typename T> static LanguageLinkage getLanguageLinkageTemplate(const T &D) { - // Language linkage is a C++ concept, but saying that everything in C has + // C++ [dcl.link]p1: All function types, function names with external linkage, + // and variable names with external linkage have a language linkage. + if (!isExternalLinkage(D.getLinkage())) + return NoLanguageLinkage; + + // Language linkage is a C++ concept, but saying that everything else in C has // C language linkage fits the implementation nicely. ASTContext &Context = D.getASTContext(); if (!Context.getLangOpts().CPlusPlus) return CLanguageLinkage; - // dcl.link 1: All function types, function names with external linkage, and - // variable names with external linkage have a language linkage. - if (!isExternalLinkage(D.getLinkage())) - return NoLanguageLinkage; - - // dcl.link 4: A C language linkage is ignored in determining the language - // linkage of the names of class members and the function type of class member - // functions. + // C++ [dcl.link]p4: A C language linkage is ignored in determining the + // language linkage of the names of class members and the function type of + // class member functions. const DeclContext *DC = D.getDeclContext(); if (DC->isRecord()) return CXXLanguageLinkage; @@ -1248,20 +1248,6 @@ LanguageLinkage VarDecl::getLanguageLinkage() const { return getLanguageLinkageTemplate(*this); } -bool VarDecl::isExternC() const { - if (getLinkage() != ExternalLinkage) - return false; - - const DeclContext *DC = getDeclContext(); - if (DC->isRecord()) - return false; - - ASTContext &Context = getASTContext(); - if (!Context.getLangOpts().CPlusPlus) - return true; - return DC->isExternCContext(); -} - VarDecl *VarDecl::getCanonicalDecl() { return getFirstDeclaration(); } @@ -1780,24 +1766,6 @@ LanguageLinkage FunctionDecl::getLanguageLinkage() const { return getLanguageLinkageTemplate(*this); } -bool FunctionDecl::isExternC() const { - if (getLinkage() != ExternalLinkage) - return false; - - if (getAttr<OverloadableAttr>()) - return false; - - const DeclContext *DC = getDeclContext(); - if (DC->isRecord()) - return false; - - ASTContext &Context = getASTContext(); - if (!Context.getLangOpts().CPlusPlus) - return true; - - return isMain() || DC->isExternCContext(); -} - bool FunctionDecl::isGlobal() const { if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(this)) return Method->isStatic(); @@ -2466,7 +2434,7 @@ unsigned FunctionDecl::getMemoryFunctionKind() const { return Builtin::BIstrlen; default: - if (hasCLanguageLinkage()) { + if (isExternC()) { if (FnInfo->isStr("memset")) return Builtin::BImemset; else if (FnInfo->isStr("memcpy")) |