forked from OSchip/llvm-project
parent
b6219a9f0e
commit
afddaa4719
|
@ -476,13 +476,6 @@ template <typename T> static bool isInExternCContext(T *D) {
|
||||||
return First->getDeclContext()->isExternCContext();
|
return First->getDeclContext()->isExternCContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isSingleLineExternC(const Decl &D) {
|
|
||||||
if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext()))
|
|
||||||
if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces())
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
|
static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
|
||||||
LVComputationKind computation) {
|
LVComputationKind computation) {
|
||||||
assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
|
assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
|
||||||
|
@ -511,8 +504,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
|
||||||
return PrevVar->getLinkageAndVisibility();
|
return PrevVar->getLinkageAndVisibility();
|
||||||
|
|
||||||
if (Var->getStorageClass() != SC_Extern &&
|
if (Var->getStorageClass() != SC_Extern &&
|
||||||
Var->getStorageClass() != SC_PrivateExtern &&
|
Var->getStorageClass() != SC_PrivateExtern)
|
||||||
!isSingleLineExternC(*Var))
|
|
||||||
return LinkageInfo::internal();
|
return LinkageInfo::internal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1588,8 +1580,11 @@ VarDecl::DefinitionKind VarDecl::isThisDeclarationADefinition(
|
||||||
// A declaration directly contained in a linkage-specification is treated
|
// A declaration directly contained in a linkage-specification is treated
|
||||||
// as if it contains the extern specifier for the purpose of determining
|
// as if it contains the extern specifier for the purpose of determining
|
||||||
// the linkage of the declared name and whether it is a definition.
|
// the linkage of the declared name and whether it is a definition.
|
||||||
if (isSingleLineExternC(*this))
|
const DeclContext *DC = getDeclContext();
|
||||||
return DeclarationOnly;
|
if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(DC)) {
|
||||||
|
if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces())
|
||||||
|
return DeclarationOnly;
|
||||||
|
}
|
||||||
|
|
||||||
// C99 6.9.2p2:
|
// C99 6.9.2p2:
|
||||||
// A declaration of an object that has file scope without an initializer,
|
// A declaration of an object that has file scope without an initializer,
|
||||||
|
|
|
@ -323,10 +323,3 @@ namespace test13 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace test14 {
|
|
||||||
extern "C" const int foo;
|
|
||||||
|
|
||||||
int f() {
|
|
||||||
return foo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue