On Tue, Jan 5, 2016 at 1:32 PM, Adrian Prantl via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> > On Dec 16, 2015, at 5:19 PM, Bob Wilson via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> On Nov 12, 2015, at 2:19 PM, Richard Smith via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> > >> Author: rsmith > >> Date: Thu Nov 12 16:19:45 2015 > >> New Revision: 252960 > >> > >> URL: http://llvm.org/viewvc/llvm-project?rev=252960&view=rev > >> Log: > >> [modules] Simplify and generalize the existing rule for finding hidden > >> declarations in redeclaration lookup. A declaration is now visible to > >> lookup if: > >> > >> * It is visible (not in a module, or in an imported module), or > >> * We're doing redeclaration lookup and it's externally-visible, or > >> * We're doing typo correction and looking for unimported decls. > >> > >> We now support multiple modules having different internal-linkage or > no-linkage > >> definitions of the same name for all entities, not just for functions, > >> variables, and some typedefs. As previously, if multiple such entities > are > >> visible, any attempt to use them will result in an ambiguity error. > >> > >> This patch fixes the linkage calculation for a number of entities where > we > >> previously didn't need to get it right (using-declarations, namespace > aliases, > >> and so on). It also classifies enumerators as always having no > linkage, which > >> is a slight deviation from the C++ standard's definition, but not an > observable > >> change outside modules (this change is being discussed on the -core > reflector > >> currently). > >> > >> This also removes the prior special case for tag lookup, which made > some cases > >> of this work, but also led to bizarre, bogus "must use 'struct' to > refer to type > >> 'Foo' in this scope" diagnostics in C++. > > > > We’re seeing a build failure that seems like it is due to this change. > The following code used to compile successfully: > > > > namespace llvm { > > template <typename DerivedT> class AllocatorBase {}; > > namespace filter { > > class Node { > > class NodeBits {}; > > class UniformBits {}; > > union { > > UniformBits UniformBits; > > }; > > static_assert(sizeof(UniformBits) <= 8, "fits in an uint64_6"); > > }; > > } > > } > > > > but now we get "error: reference to 'UniformBits' is ambiguous” from the > static_assert. It looks to me like this really is ambiguous and that the > code should be changed. Can you confirm that? > > [class.union] §9.5.5 states that "The names of the members of an anonymous > union shall be distinct from the names of any other entity in the scope in > which the anonymous union is declared.” > > I read that as a confirmation that this is indeed illegal. > Yes, but we're diagnosing it the wrong way -- it's ill-formed even before the ambiguous lookup that we now diagnose. > -- adrian > > > > > I also noticed that we get a duplicated diagnostic in this case. I > noticed that you fixed a related case in r252967, but it seems to be > missing this case. > > > >> > >> Added: > >> cfe/trunk/test/Modules/Inputs/no-linkage/ > >> cfe/trunk/test/Modules/Inputs/no-linkage/decls.h > >> cfe/trunk/test/Modules/Inputs/no-linkage/empty.h > >> cfe/trunk/test/Modules/Inputs/no-linkage/module.modulemap > >> cfe/trunk/test/Modules/no-linkage.cpp > >> Modified: > >> cfe/trunk/include/clang/Sema/Lookup.h > >> cfe/trunk/lib/AST/Decl.cpp > >> cfe/trunk/lib/Sema/SemaDecl.cpp > >> cfe/trunk/lib/Sema/SemaDeclCXX.cpp > >> cfe/trunk/test/Index/linkage.c > >> cfe/trunk/test/Index/usrs.m > >> cfe/trunk/test/Modules/decldef.m > >> cfe/trunk/test/Modules/merge-enumerators.cpp > >> cfe/trunk/test/Modules/module-private.cpp > >> cfe/trunk/test/Modules/submodule-visibility-cycles.cpp > >> cfe/trunk/test/Modules/submodules-merge-defs.cpp > >> > >> Modified: cfe/trunk/include/clang/Sema/Lookup.h > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Lookup.h?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/include/clang/Sema/Lookup.h (original) > >> +++ cfe/trunk/include/clang/Sema/Lookup.h Thu Nov 12 16:19:45 2015 > >> @@ -139,8 +139,7 @@ public: > >> Redecl(Redecl != Sema::NotForRedeclaration), > >> HideTags(true), > >> Diagnose(Redecl == Sema::NotForRedeclaration), > >> - AllowHidden(Redecl == Sema::ForRedeclaration), > >> - AllowHiddenInternal(AllowHidden), > >> + AllowHidden(false), > >> Shadowed(false) > >> { > >> configure(); > >> @@ -162,8 +161,7 @@ public: > >> Redecl(Redecl != Sema::NotForRedeclaration), > >> HideTags(true), > >> Diagnose(Redecl == Sema::NotForRedeclaration), > >> - AllowHidden(Redecl == Sema::ForRedeclaration), > >> - AllowHiddenInternal(AllowHidden), > >> + AllowHidden(false), > >> Shadowed(false) > >> { > >> configure(); > >> @@ -184,7 +182,6 @@ public: > >> HideTags(Other.HideTags), > >> Diagnose(false), > >> AllowHidden(Other.AllowHidden), > >> - AllowHiddenInternal(Other.AllowHiddenInternal), > >> Shadowed(false) > >> {} > >> > >> @@ -226,27 +223,16 @@ public: > >> /// \brief Specify whether hidden declarations are visible, e.g., > >> /// for recovery reasons. > >> void setAllowHidden(bool AH) { > >> - AllowHiddenInternal = AllowHidden = AH; > >> - } > >> - > >> - /// \brief Specify whether hidden internal declarations are visible. > >> - void setAllowHiddenInternal(bool AHI) { > >> - AllowHiddenInternal = AHI; > >> + AllowHidden = AH; > >> } > >> > >> /// \brief Determine whether this lookup is permitted to see hidden > >> /// declarations, such as those in modules that have not yet been > imported. > >> bool isHiddenDeclarationVisible(NamedDecl *ND) const { > >> - // If a using-shadow declaration is hidden, it's never visible, not > >> - // even to redeclaration lookup. > >> - // FIXME: Should this apply to typedefs and namespace aliases too? > >> - if (isa<UsingShadowDecl>(ND) && LookupKind != > Sema::LookupUsingDeclName) > >> - return false; > >> - return (AllowHidden && > >> - (AllowHiddenInternal || ND->isExternallyVisible())) || > >> - LookupKind == Sema::LookupTagName; > >> + return AllowHidden || > >> + (isForRedeclaration() && ND->isExternallyVisible()); > >> } > >> - > >> + > >> /// Sets whether tag declarations should be hidden by non-tag > >> /// declarations during resolution. The default is true. > >> void setHideTags(bool Hide) { > >> @@ -317,7 +303,8 @@ public: > >> if (!D->isInIdentifierNamespace(IDNS)) > >> return nullptr; > >> > >> - if (isHiddenDeclarationVisible(D) || isVisible(getSema(), D)) > >> + if (!D->isHidden() || isHiddenDeclarationVisible(D) || > >> + isVisibleSlow(getSema(), D)) > >> return D; > >> > >> return getAcceptableDeclSlow(D); > >> @@ -526,7 +513,6 @@ public: > >> /// \brief Change this lookup's redeclaration kind. > >> void setRedeclarationKind(Sema::RedeclarationKind RK) { > >> Redecl = RK; > >> - AllowHiddenInternal = AllowHidden = (RK == Sema::ForRedeclaration); > >> configure(); > >> } > >> > >> @@ -698,9 +684,6 @@ private: > >> /// \brief True if we should allow hidden declarations to be 'visible'. > >> bool AllowHidden; > >> > >> - /// \brief True if we should allow hidden internal declarations to > be visible. > >> - bool AllowHiddenInternal; > >> - > >> /// \brief True if the found declarations were shadowed by some other > >> /// declaration that we skipped. This only happens when \c LookupKind > >> /// is \c LookupRedeclarationWithLinkage. > >> > >> Modified: cfe/trunk/lib/AST/Decl.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/lib/AST/Decl.cpp (original) > >> +++ cfe/trunk/lib/AST/Decl.cpp Thu Nov 12 16:19:45 2015 > >> @@ -635,6 +635,8 @@ static LinkageInfo getLVForNamespaceScop > >> if (D->isInAnonymousNamespace()) { > >> const auto *Var = dyn_cast<VarDecl>(D); > >> const auto *Func = dyn_cast<FunctionDecl>(D); > >> + // FIXME: In C++11 onwards, anonymous namespaces should give decls > >> + // within them internal linkage, not unique external linkage. > >> if ((!Var || !isFirstInExternCContext(Var)) && > >> (!Func || !isFirstInExternCContext(Func))) > >> return LinkageInfo::uniqueExternal(); > >> @@ -821,10 +823,14 @@ static LinkageInfo getLVForNamespaceScop > >> } else if (isa<ObjCInterfaceDecl>(D)) { > >> // fallout > >> > >> + } else if (auto *TD = dyn_cast<TypedefNameDecl>(D)) { > >> + // A typedef declaration has linkage if it gives a type a name for > >> + // linkage purposes. > >> + if (!TD->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) > >> + return LinkageInfo::none(); > >> + > >> // Everything not covered here has no linkage. > >> } else { > >> - // FIXME: A typedef declaration has linkage if it gives a type a > name for > >> - // linkage purposes. > >> return LinkageInfo::none(); > >> } > >> > >> @@ -1226,8 +1232,32 @@ static LinkageInfo computeLVForDecl(cons > >> switch (D->getKind()) { > >> default: > >> break; > >> + > >> + // Per C++ [basic.link]p2, only the names of objects, references, > >> + // functions, types, templates, namespaces, and values ever have > linkage. > >> + // > >> + // Note that the name of a typedef, namespace alias, using > declaration, > >> + // and so on are not the name of the corresponding type, > namespace, or > >> + // declaration, so they do *not* have linkage. > >> + case Decl::EnumConstant: // FIXME: This has linkage, but that's > dumb. > >> + case Decl::ImplicitParam: > >> + case Decl::Label: > >> + case Decl::NamespaceAlias: > >> case Decl::ParmVar: > >> + case Decl::Using: > >> + case Decl::UsingShadow: > >> + case Decl::UsingDirective: > >> return LinkageInfo::none(); > >> + > >> + case Decl::Typedef: > >> + case Decl::TypeAlias: > >> + // A typedef declaration has linkage if it gives a type a name > for > >> + // linkage purposes. > >> + if (!cast<TypedefNameDecl>(D) > >> + ->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) > >> + return LinkageInfo::none(); > >> + break; > >> + > >> case Decl::TemplateTemplateParm: // count these as external > >> case Decl::NonTypeTemplateParm: > >> case Decl::ObjCAtDefsField: > >> > >> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > >> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Nov 12 16:19:45 2015 > >> @@ -4819,12 +4819,6 @@ NamedDecl *Sema::HandleDeclarator(Scope > >> LookupResult Previous(*this, NameInfo, LookupOrdinaryName, > >> ForRedeclaration); > >> > >> - // If we're hiding internal-linkage symbols in modules from > redeclaration > >> - // lookup, let name lookup know. > >> - if ((getLangOpts().Modules || getLangOpts().ModulesLocalVisibility) > && > >> - D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef) > >> - Previous.setAllowHiddenInternal(false); > >> - > >> // See if this is a redefinition of a variable in the same scope. > >> if (!D.getCXXScopeSpec().isSet()) { > >> bool IsLinkageLookup = false; > >> > >> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) > >> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Nov 12 16:19:45 2015 > >> @@ -7206,23 +7206,13 @@ Decl *Sema::ActOnStartNamespaceDef(Scope > >> // treated as an original-namespace-name. > >> // > >> // Since namespace names are unique in their scope, and we don't > >> - // look through using directives, just look for any ordinary names. > >> - > >> - const unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_Member | > >> - Decl::IDNS_Type | Decl::IDNS_Using | Decl::IDNS_Tag | > >> - Decl::IDNS_Namespace; > >> - NamedDecl *PrevDecl = nullptr; > >> - DeclContext::lookup_result R = > CurContext->getRedeclContext()->lookup(II); > >> - for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != > E; > >> - ++I) { > >> - if ((*I)->getIdentifierNamespace() & IDNS) { > >> - PrevDecl = *I; > >> - break; > >> - } > >> - } > >> - > >> + // look through using directives, just look for any ordinary names > >> + // as if by qualified name lookup. > >> + LookupResult R(*this, II, IdentLoc, LookupOrdinaryName, > ForRedeclaration); > >> + LookupQualifiedName(R, CurContext->getRedeclContext()); > >> + NamedDecl *PrevDecl = R.getAsSingle<NamedDecl>(); > >> PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl); > >> - > >> + > >> if (PrevNS) { > >> // This is an extended namespace definition. > >> if (IsInline != PrevNS->isInline()) > >> > >> Modified: cfe/trunk/test/Index/linkage.c > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/linkage.c?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Index/linkage.c (original) > >> +++ cfe/trunk/test/Index/linkage.c Thu Nov 12 16:19:45 2015 > >> @@ -20,7 +20,7 @@ void f16(void) { > >> > >> > >> // CHECK: EnumDecl=Baz:3:6 (Definition)linkage=External > >> -// CHECK: EnumConstantDecl=Qux:3:12 (Definition)linkage=External > >> +// CHECK: EnumConstantDecl=Qux:3:12 (Definition)linkage=NoLinkage > >> // CHECK: VarDecl=x:4:5linkage=External > >> // CHECK: FunctionDecl=foo:5:6linkage=External > >> // CHECK: VarDecl=w:6:12linkage=Internal > >> > >> Modified: cfe/trunk/test/Index/usrs.m > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/usrs.m?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Index/usrs.m (original) > >> +++ cfe/trunk/test/Index/usrs.m Thu Nov 12 16:19:45 2015 > >> @@ -119,7 +119,7 @@ int test_multi_declaration(void) { > >> // CHECK: usrs.m c:@SA@MyStruct Extent=[15:9 - 18:2] > >> // CHECK: usrs.m c:@SA@MyStruct@FI@wa Extent=[16:3 - 16:9] > >> // CHECK: usrs.m c:@SA@MyStruct@FI@moo Extent=[17:3 - 17:10] > >> -// CHECK: usrs.m c:usrs.m@T@MyStruct Extent=[15:1 - 18:11] > >> +// CHECK: usrs.m c:@T@MyStruct Extent=[15:1 - 18:11] > >> // CHECK: usrs.m c:@E@Pizza Extent=[20:1 - 23:2] > >> // CHECK: usrs.m c:@E@Pizza@CHEESE Extent=[21:3 - 21:9] > >> // CHECK: usrs.m c:@E@Pizza@MUSHROOMS Extent=[22:3 - 22:12] > >> > >> Added: cfe/trunk/test/Modules/Inputs/no-linkage/decls.h > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/no-linkage/decls.h?rev=252960&view=auto > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/Inputs/no-linkage/decls.h (added) > >> +++ cfe/trunk/test/Modules/Inputs/no-linkage/decls.h Thu Nov 12 > 16:19:45 2015 > >> @@ -0,0 +1,6 @@ > >> +namespace RealNS { int UsingDecl; } > >> +namespace NS = RealNS; > >> +typedef int Typedef; > >> +using AliasDecl = int; > >> +enum Enum { Enumerator }; > >> +using RealNS::UsingDecl; > >> > >> Added: cfe/trunk/test/Modules/Inputs/no-linkage/empty.h > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/no-linkage/empty.h?rev=252960&view=auto > >> > ============================================================================== > >> (empty) > >> > >> Added: cfe/trunk/test/Modules/Inputs/no-linkage/module.modulemap > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/no-linkage/module.modulemap?rev=252960&view=auto > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/Inputs/no-linkage/module.modulemap (added) > >> +++ cfe/trunk/test/Modules/Inputs/no-linkage/module.modulemap Thu Nov > 12 16:19:45 2015 > >> @@ -0,0 +1 @@ > >> +module M { module E { header "empty.h" } module D { header "decls.h" } > } > >> > >> Modified: cfe/trunk/test/Modules/decldef.m > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/decldef.m?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/decldef.m (original) > >> +++ cfe/trunk/test/Modules/decldef.m Thu Nov 12 16:19:45 2015 > >> @@ -11,7 +11,13 @@ Def *def; > >> #ifdef USE_EARLY > >> A *a1; // expected-error{{declaration of 'A' must be imported from > module 'decldef.Def' before it is required}} > >> #endif > >> -B *b1; // expected-error{{must use 'struct' tag to refer to type 'B'}} > >> +B *b1; > >> +#ifdef USE_EARLY > >> +// expected-error@-2{{must use 'struct' tag to refer to type 'B'}} > >> +#else > >> +// expected-error@-4{{declaration of 'B' must be imported from module > 'decldef.Decl' before it is required}} > >> +// expected-note@Inputs/decl.h:2 {{previous}} > >> +#endif > >> @import decldef.Decl; > >> > >> A *a2; > >> > >> Modified: cfe/trunk/test/Modules/merge-enumerators.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/merge-enumerators.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/merge-enumerators.cpp (original) > >> +++ cfe/trunk/test/Modules/merge-enumerators.cpp Thu Nov 12 16:19:45 > 2015 > >> @@ -16,11 +16,13 @@ > >> > >> #ifdef MERGE_LATE > >> namespace N { > >> - // FIXME: Should we accept this and reject the usage below due to > ambiguity instead? > >> - enum { A } a; // expected-error {{redefinition of enumerator 'A'}} > >> - // expected-note@a.h:1 {{here}} (from module B.b) > >> + enum { A } a; // expected-note {{candidate}} > >> + // expected-note@a.h:1 {{candidate}} (from module B.b) > >> } > >> #include "a.h" > >> #endif > >> > >> N::E e = N::A; > >> +#ifdef MERGE_LATE > >> +// expected-error@-2 {{ambiguous}} > >> +#endif > >> > >> Modified: cfe/trunk/test/Modules/module-private.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module-private.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/module-private.cpp (original) > >> +++ cfe/trunk/test/Modules/module-private.cpp Thu Nov 12 16:19:45 2015 > >> @@ -12,11 +12,7 @@ void test() { > >> } > >> > >> int test_broken() { > >> - HiddenStruct hidden; // \ > >> - // expected-error{{must use 'struct' tag to refer to type > 'HiddenStruct' in this scope}} \ > >> - // expected-error{{definition of 'HiddenStruct' must be imported}} > >> - // expected-note@Inputs/module_private_left.h:3 {{previous > definition is here}} > >> - > >> + HiddenStruct hidden; // expected-error{{unknown type name > 'HiddenStruct'}} > >> Integer i; // expected-error{{unknown type name 'Integer'}} > >> > >> int *ip = 0; > >> > >> Added: cfe/trunk/test/Modules/no-linkage.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/no-linkage.cpp?rev=252960&view=auto > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/no-linkage.cpp (added) > >> +++ cfe/trunk/test/Modules/no-linkage.cpp Thu Nov 12 16:19:45 2015 > >> @@ -0,0 +1,35 @@ > >> +// RUN: rm -rf %t > >> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t > -fmodules-local-submodule-visibility -I%S/Inputs/no-linkage > -fmodule-map-file=%S/Inputs/no-linkage/module.modulemap %s -verify > >> + > >> +#include "empty.h" > >> + > >> +namespace NS { int n; } // expected-note {{candidate}} > >> +struct Typedef { int n; }; // expected-note {{candidate}} > >> +int AliasDecl; // expected-note {{candidate}} > >> +enum AlsoAnEnum { Enumerator }; // expected-note {{candidate}} > >> +int UsingDecl; // expected-note {{candidate}} > >> + > >> +// expected-note@decls.h:2 {{candidate}} > >> +// expected-note@decls.h:3 {{candidate}} > >> +// expected-note@decls.h:4 {{candidate}} > >> +// expected-note@decls.h:5 {{candidate}} > >> +// expected-note@decls.h:6 {{candidate}} > >> + > >> +void use(int); > >> +void use_things() { > >> + use(Typedef().n); > >> + use(NS::n); > >> + use(AliasDecl); > >> + use(Enumerator); > >> + use(UsingDecl); > >> +} > >> + > >> +#include "decls.h" > >> + > >> +void use_things_again() { > >> + use(Typedef().n); // expected-error {{ambiguous}} > >> + use(NS::n); // expected-error {{ambiguous}} expected-error{{'NS' is > not a class, namespace, or enumeration}} > >> + use(AliasDecl); // expected-error {{ambiguous}} > >> + use(Enumerator); // expected-error {{ambiguous}} > >> + use(UsingDecl); // expected-error {{ambiguous}} > >> +} > >> > >> Modified: cfe/trunk/test/Modules/submodule-visibility-cycles.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodule-visibility-cycles.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/submodule-visibility-cycles.cpp (original) > >> +++ cfe/trunk/test/Modules/submodule-visibility-cycles.cpp Thu Nov 12 > 16:19:45 2015 > >> @@ -3,7 +3,7 @@ > >> > >> #include "cycle1.h" > >> C1 c1; > >> -C2 c2; // expected-error {{must be imported}} expected-error {{}} > >> +C2 c2; // expected-error {{must be imported}} > >> // expected-note@cycle2.h:6 {{here}} > >> > >> #include "cycle2.h" > >> > >> Modified: cfe/trunk/test/Modules/submodules-merge-defs.cpp > >> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodules-merge-defs.cpp?rev=252960&r1=252959&r2=252960&view=diff > >> > ============================================================================== > >> --- cfe/trunk/test/Modules/submodules-merge-defs.cpp (original) > >> +++ cfe/trunk/test/Modules/submodules-merge-defs.cpp Thu Nov 12 > 16:19:45 2015 > >> @@ -12,7 +12,7 @@ > >> #include "indirect.h" > >> #endif > >> > >> -A pre_a; // expected-error {{must use 'struct'}} > >> +A pre_a; > >> #ifdef IMPORT_USE_2 > >> // expected-error-re@-2 {{must be imported from one of > {{.*}}stuff.use{{.*}}stuff.use-2}} > >> #elif EARLY_INDIRECT_INCLUDE > >> @@ -21,29 +21,28 @@ A pre_a; // expected-error {{must use 's > >> // expected-error@-6 {{must be imported from module 'stuff.use'}} > >> #endif > >> // expected-note@defs.h:1 +{{here}} > >> +extern class A pre_a2; > >> +int pre_use_a = use_a(pre_a2); // expected-error {{'A' must be > imported}} expected-error {{'use_a' must be imported}} > >> // expected-note@defs.h:2 +{{here}} > >> -int pre_use_a = use_a(pre_a); // expected-error {{'A' must be > imported}} expected-error {{'use_a' must be imported}} > >> > >> B::Inner2 pre_bi; // expected-error +{{must be imported}} > >> // expected-note@defs.h:4 +{{here}} > >> // expected-note@defs.h:17 +{{here}} > >> -void pre_bfi(B b) { // expected-error {{must use 'class'}} > expected-error +{{must be imported}} > >> - b.f<int>(); // expected-error +{{must be imported}} expected-error > +{{}} > >> - // expected-note@defs.h:19 +{{here}} > >> +void pre_bfi(B b) { // expected-error +{{must be imported}} > >> + b.f<int>(); // expected-error +{{}} > >> } > >> > >> C_Base<1> pre_cb1; // expected-error +{{must be imported}} > >> // expected-note@defs.h:23 +{{here}} > >> -C1 pre_c1; // expected-error +{{must be imported}} expected-error > {{must use 'struct'}} > >> +C1 pre_c1; // expected-error +{{must be imported}} > >> // expected-note@defs.h:25 +{{here}} > >> -C2 pre_c2; // expected-error +{{must be imported}} expected-error > {{must use 'struct'}} > >> +C2 pre_c2; // expected-error +{{must be imported}} > >> // expected-note@defs.h:26 +{{here}} > >> > >> D::X pre_dx; // expected-error +{{must be imported}} > >> // expected-note@defs.h:28 +{{here}} > >> // expected-note@defs.h:29 +{{here}} > >> -// FIXME: We should warn that use_dx is being used without being > imported. > >> -int pre_use_dx = use_dx(pre_dx); > >> +int pre_use_dx = use_dx(pre_dx); // ignored; pre_dx is invalid > >> > >> int pre_e = E(0); // expected-error {{must be imported}} > >> // expected-note@defs.h:32 +{{here}} > >> @@ -69,8 +68,9 @@ J<> pre_j; // expected-error {{declarati > >> #endif > >> // expected-note@defs.h:58 +{{here}} > >> > >> -ScopedEnum pre_scopedenum; // expected-error {{must be imported}} > expected-error {{must use 'enum'}} > >> -// expected-note@defs.h:106 {{here}} > >> +ScopedEnum pre_scopedenum; // expected-error {{must be imported}} > >> +// expected-note@defs.h:105 0-1{{here}} > >> +// expected-note@defs.h:106 0-1{{here}} > >> enum ScopedEnum : int; > >> ScopedEnum pre_scopedenum_declared; // ok > >> > >> > >> > >> _______________________________________________ > >> 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 > > _______________________________________________ > 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