On Mon, Nov 16, 2015 at 7:09 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
> On Mon, Nov 16, 2015 at 7:00 PM, Sean Silva <chisophu...@gmail.com> wrote: > >> On Sat, Nov 14, 2015 at 2:30 PM, Richard Smith <rich...@metafoo.co.uk> >> wrote: >> >>> On Nov 13, 2015 7:23 PM, "Sean Silva" <chisophu...@gmail.com> wrote: >>> > >>> > >>> > >>> > On Thu, Nov 12, 2015 at 9:14 PM, Richard Smith via cfe-commits < >>> cfe-commits@lists.llvm.org> wrote: >>> >> >>> >> Author: rsmith >>> >> Date: Thu Nov 12 23:14:45 2015 >>> >> New Revision: 253012 >>> >> >>> >> URL: http://llvm.org/viewvc/llvm-project?rev=253012&view=rev >>> >> Log: >>> >> [modules] When a declaration has non-trivial visibility, check >>> whether it's >>> > >>> > >>> > What is "non-trivial visibility"? Is this "visibility" something that >>> exists in the present C++ language? (e.g. `using namespace std` etc.) or is >>> this a different notion? >>> >>> This is the modules notion of visibility (whether the declaration has >>> been imported or not). Here, non-trivial visibility means "not known to be >>> unconditionally visible", and corresponds to the Hidden flag on the Decl >>> being true. >>> >> >> I just looked at the comment on the `Hidden` flag and it doesn't seem to >> mention anything about being "trivial" or "non-trivial". Why say >> "declaration has non-trivial visibility" instead of just "declaration is >> hidden"? Do they mean different things? >> > > Yes; the comment on that flag is out of date. Whether a declaration is > visible is a function of several factors and isn't as simple as checking > that flag. When performing template instantiation, names from unimported > modules (and module-private names from imported modules) can be made > visible if they were visible when the template was defined. When local > submodule visibility is enabled, the visibility of a declaration is > computed each time we reference it, because module visibility is not > monotonically increasing. > Ah, that makes sense. Also that sounds scary complicated. -- Sean Silva > > If the Hidden flag is false, the declararation is unconditionally visible. > If the Hidden flag is true, the declaration might still be visible, > depending on who's asking and from where. > > >> -- Sean Silva >> >> >>> > -- Sean Silva >>> > >>> >> >>> >> actually hidden before we check its linkage. This avoids computing >>> the linkage >>> >> "too early" for an anonymous struct with a typedef name for linkage. >>> >> >>> >> Modified: >>> >> cfe/trunk/include/clang/Sema/Lookup.h >>> >> cfe/trunk/test/Modules/submodule-visibility.cpp >>> >> >>> >> Modified: cfe/trunk/include/clang/Sema/Lookup.h >>> >> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Lookup.h?rev=253012&r1=253011&r2=253012&view=diff >>> >> >>> ============================================================================== >>> >> --- cfe/trunk/include/clang/Sema/Lookup.h (original) >>> >> +++ cfe/trunk/include/clang/Sema/Lookup.h Thu Nov 12 23:14:45 2015 >>> >> @@ -303,8 +303,7 @@ public: >>> >> if (!D->isInIdentifierNamespace(IDNS)) >>> >> return nullptr; >>> >> >>> >> - if (!D->isHidden() || isHiddenDeclarationVisible(D) || >>> >> - isVisibleSlow(getSema(), D)) >>> >> + if (isVisible(getSema(), D) || isHiddenDeclarationVisible(D)) >>> >> return D; >>> >> >>> >> return getAcceptableDeclSlow(D); >>> >> >>> >> Modified: cfe/trunk/test/Modules/submodule-visibility.cpp >>> >> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodule-visibility.cpp?rev=253012&r1=253011&r2=253012&view=diff >>> >> >>> ============================================================================== >>> >> --- cfe/trunk/test/Modules/submodule-visibility.cpp (original) >>> >> +++ cfe/trunk/test/Modules/submodule-visibility.cpp Thu Nov 12 >>> 23:14:45 2015 >>> >> @@ -28,3 +28,10 @@ int k = n + m; // OK, a and b are visibl >>> >> #ifndef B >>> >> #error B is not defined >>> >> #endif >>> >> + >>> >> +// Ensure we don't compute the linkage of this struct before we find >>> it has a >>> >> +// typedef name for linkage purposes. >>> >> +typedef struct { >>> >> + int p; >>> >> + void (*f)(int p); >>> >> +} name_for_linkage; >>> >> >>> >> >>> >> _______________________________________________ >>> >> cfe-commits mailing list >>> >> cfe-commits@lists.llvm.org >>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> > >>> > >>> >> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits