diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-06-22 21:15:01 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-06-22 21:15:01 +0000 |
commit | 529ecb237ac423b29a555b5ef930c118d117a542 (patch) | |
tree | 5c849f3ce3528f70221036e39c8b3be19701bb8d /clang/lib | |
parent | 6072d2b97f7a4bf896d5fd308c5c07e33788f445 (diff) | |
download | bcm5719-llvm-529ecb237ac423b29a555b5ef930c118d117a542.tar.gz bcm5719-llvm-529ecb237ac423b29a555b5ef930c118d117a542.zip |
[modules] Add a flag to disable the feature that permits conflicting redefinitions of internal-linkage symbols that are not visible.
Such conflicts are an accident waiting to happen, and this feature conflicts
with the desire to include existing headers into multiple modules and merge the
results. (In an ideal world, it should not be possible to export internal
linkage symbols from a module, but sadly the glibc and libstdc++ headers
provide 'static inline' functions in a few cases.)
llvm-svn: 240335
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 14 |
2 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 7a3391685a4..2d26548db39 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1521,6 +1521,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse; Opts.ModulesLocalVisibility = Args.hasArg(OPT_fmodules_local_submodule_visibility); + Opts.ModulesHideInternalLinkage = + !Args.hasArg(OPT_fno_modules_hide_internal_linkage); Opts.ModulesSearchAll = Opts.Modules && !Args.hasArg(OPT_fno_modules_search_all) && Args.hasArg(OPT_fmodules_search_all); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index cb1be8d5053..ee039940585 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1804,7 +1804,8 @@ static void filterNonConflictingPreviousDecls(Sema &S, NamedDecl *decl, LookupResult &previous){ // This is only interesting when modules are enabled. - if (!S.getLangOpts().Modules && !S.getLangOpts().ModulesLocalVisibility) + if ((!S.getLangOpts().Modules && !S.getLangOpts().ModulesLocalVisibility) || + !S.getLangOpts().ModulesHideInternalLinkage) return; // Empty sets are uninteresting. @@ -3453,8 +3454,9 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) { New->isThisDeclarationADefinition() == VarDecl::Definition && (Def = Old->getDefinition())) { NamedDecl *Hidden = nullptr; - if (!hasVisibleDefinition(Def, &Hidden) && - (New->getDescribedVarTemplate() || + if (!hasVisibleDefinition(Def, &Hidden) && + (New->getFormalLinkage() == InternalLinkage || + New->getDescribedVarTemplate() || New->getNumTemplateParameterLists() || New->getDeclContext()->isDependentContext())) { // The previous definition is hidden, and multiple definitions are @@ -8946,7 +8948,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, if ((Def = VDecl->getDefinition()) && Def != VDecl) { NamedDecl *Hidden = nullptr; if (!hasVisibleDefinition(Def, &Hidden) && - (VDecl->getDescribedVarTemplate() || + (VDecl->getFormalLinkage() == InternalLinkage || + VDecl->getDescribedVarTemplate() || VDecl->getNumTemplateParameterLists() || VDecl->getDeclContext()->isDependentContext())) { // The previous definition is hidden, and multiple definitions are @@ -10367,7 +10370,8 @@ Sema::CheckForFunctionRedefinition(FunctionDecl *FD, // in this case? That may be necessary for functions that return local types // through a deduced return type, or instantiate templates with local types. if (!hasVisibleDefinition(Definition) && - (Definition->isInlineSpecified() || + (Definition->getFormalLinkage() == InternalLinkage || + Definition->isInlineSpecified() || Definition->getDescribedFunctionTemplate() || Definition->getNumTemplateParameterLists())) return; |