Update: Vassil and I have dug into this a bit offline. It looks like the root cause is a likely-pre-existing bug where we somehow import a default constructor for a class from a module but don't set the "has a default constructor" flag on the class definition.
On Fri, May 13, 2016 at 2:54 AM, Vassil Vassilev <v.g.vassi...@gmail.com> wrote: > Hi Richard, > I believe this broke our modules builds. Last successful one was with > r269388 and the current with r269389 fails with: > > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/type_traits:69:12: > error: constructor cannot be redeclared > struct integral_constant > ^ > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/type_traits:69:12: > note: previous implicit declaration is here > struct integral_constant > ^ > /mnt/build/workspace/root-nightly-master-cxxmodules/BUILDTYPE/Release/COMPILER/native/LABEL/sft-fedora-1/clang_build_269398/ROOT/src/core/meta/src/TGenericClassInfo.cxx:18:10: > fatal error: could not build module 'TCollectionProxyInfo.h' > #include "TCollectionProxyInfo.h" > ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~ > 2 errors generated. > > and > > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/new:99:10: > error: multiple overloads of 'nothrow_t' instantiate to the same signature > 'void ()' > struct nothrow_t { }; > ^ > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/bits/alloc_traits.h:253:8: > note: in instantiation of function template specialization > '__gnu_cxx::new_allocator<std::pair<int, int> >::construct<std::pair<int, > int>, const std::pair<int, int> &>' requested here > { __a.construct(__p, std::forward<_Args>(__args)...); } > ^ > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/bits/alloc_traits.h:399:4: > note: in instantiation of function template specialization > 'std::allocator_traits<std::allocator<std::pair<int, int> > > >::_S_construct<std::pair<int, int>, const std::pair<int, int> &>' requested > here > { _S_construct(__a, __p, std::forward<_Args>(__args)...); } > ^ > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/bits/stl_vector.h:917:21: > note: in instantiation of function template specialization > 'std::allocator_traits<std::allocator<std::pair<int, int> > > >::construct<std::pair<int, int>, const std::pair<int, int> &>' requested here > _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, > ^ > /mnt/build/workspace/root-nightly-master-cxxmodules/BUILDTYPE/Release/COMPILER/native/LABEL/sft-fedora-1/clang_build_269398/ROOT/src/core/meta/src/TSchemaRule.cxx:873:21: > note: in instantiation of member function 'std::vector<std::pair<int, int>, > std::allocator<std::pair<int, int> > >::push_back' requested here > fVersionVect->push_back( verpair ); > ^ > /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/new:99:10: > note: previous implicit declaration is here > struct nothrow_t { }; > > > Shall I start reducing the issues one by one or we can revert this patch? > Vassil On 13/05/16 08:47, Richard Smith via cfe-commits wrote: > > Author: rsmith > Date: Fri May 13 01:47:56 2016 > New Revision: 269398 > > URL: http://llvm.org/viewvc/llvm-project?rev=269398&view=rev > Log: > Add support for derived class special members hiding functions brought in from > a base class via a using-declaration. If a class has a using-declaration > declaring either a constructor or an assignment operator, eagerly declare its > special members in case they need to displace a shadow declaration from a > using-declaration. > > Modified: > cfe/trunk/include/clang/AST/DeclCXX.h > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/AST/ASTImporter.cpp > cfe/trunk/lib/AST/DeclCXX.cpp > cfe/trunk/lib/Sema/SemaDeclCXX.cpp > cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > cfe/trunk/lib/Serialization/ASTWriter.cpp > cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p12.cpp > cfe/trunk/test/SemaCUDA/implicit-member-target.cu > cfe/trunk/test/SemaCXX/constructor-recovery.cpp > > Modified: cfe/trunk/include/clang/AST/DeclCXX.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/DeclCXX.h (original) > +++ cfe/trunk/include/clang/AST/DeclCXX.h Fri May 13 01:47:56 2016 > @@ -382,6 +382,14 @@ class CXXRecordDecl : public RecordDecl > /// provided default ctor also doesn't have an in-class initializer. > unsigned HasUninitializedFields : 1; > > + /// \brief True if there are any member using-declarations that inherit > + /// constructors from a base class. > + unsigned HasInheritedConstructor : 1; > + > + /// \brief True if there are any member using-declarations named > + /// 'operator='. > + unsigned HasInheritedAssignment : 1; > + > /// \brief These flags are \c true if a defaulted corresponding special > /// member can't be fully analyzed without performing overload > resolution. > /// @{ > @@ -1308,6 +1316,18 @@ public: > return data().HasNonLiteralTypeFieldsOrBases; > } > > + /// \brief Determine whether this class has a using-declaration that names > + /// a base class constructor. > + bool hasInheritedConstructor() const { > + return data().HasInheritedConstructor; > + } > + > + /// \brief Determine whether this class has a using-declaration that names > + /// a base class assignment operator. > + bool hasInheritedAssignment() const { > + return data().HasInheritedAssignment; > + } > + > /// \brief Determine whether this class is considered trivially copyable > per > /// (C++11 [class]p6). > bool isTriviallyCopyable() const; > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Fri May 13 01:47:56 2016 > @@ -4540,6 +4540,9 @@ public: > /// class. > void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class); > > + /// \brief Check a completed declaration of an implicit special member. > + void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD); > + > /// \brief Determine whether the given function is an implicitly-deleted > /// special member function. > bool isImplicitlyDeleted(FunctionDecl *FD); > > Modified: cfe/trunk/lib/AST/ASTImporter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/ASTImporter.cpp (original) > +++ cfe/trunk/lib/AST/ASTImporter.cpp Fri May 13 01:47:56 2016 > @@ -2115,6 +2115,8 @@ bool ASTNodeImporter::ImportDefinition(R > ToData.HasUninitializedReferenceMember > = FromData.HasUninitializedReferenceMember; > ToData.HasUninitializedFields = FromData.HasUninitializedFields; > + ToData.HasInheritedConstructor = FromData.HasInheritedConstructor; > + ToData.HasInheritedAssignment = FromData.HasInheritedAssignment; > ToData.NeedOverloadResolutionForMoveConstructor > = FromData.NeedOverloadResolutionForMoveConstructor; > ToData.NeedOverloadResolutionForMoveAssignment > > Modified: cfe/trunk/lib/AST/DeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/DeclCXX.cpp (original) > +++ cfe/trunk/lib/AST/DeclCXX.cpp Fri May 13 01:47:56 2016 > @@ -53,6 +53,7 @@ CXXRecordDecl::DefinitionData::Definitio > HasPublicFields(false), HasMutableFields(false), > HasVariantMembers(false), > HasOnlyCMembers(true), HasInClassInitializer(false), > HasUninitializedReferenceMember(false), HasUninitializedFields(false), > + HasInheritedConstructor(false), HasInheritedAssignment(false), > NeedOverloadResolutionForMoveConstructor(false), > NeedOverloadResolutionForMoveAssignment(false), > NeedOverloadResolutionForDestructor(false), > @@ -955,6 +956,15 @@ void CXXRecordDecl::addedMember(Decl *D) > data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess()); > } > } > + > + if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) { > + if (Using->getDeclName().getNameKind() == > + DeclarationName::CXXConstructorName) > + data().HasInheritedConstructor = true; > + > + if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal) > + data().HasInheritedAssignment = true; > + } > } > > void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) { > > Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri May 13 01:47:56 2016 > @@ -6455,20 +6455,28 @@ void Sema::AddImplicitlyDeclaredMembersT > if (!ClassDecl->hasUserDeclaredConstructor()) > ++ASTContext::NumImplicitDefaultConstructors; > > + // If this class inherited any constructors, declare the default > constructor > + // now in case it displaces one from a base class. > + if (ClassDecl->needsImplicitDefaultConstructor() && > + ClassDecl->hasInheritedConstructor()) > + DeclareImplicitDefaultConstructor(ClassDecl); > + > if (!ClassDecl->hasUserDeclaredCopyConstructor()) { > ++ASTContext::NumImplicitCopyConstructors; > > // If the properties or semantics of the copy constructor couldn't be > // determined while the class was being declared, force a declaration > // of it now. > - if (ClassDecl->needsOverloadResolutionForCopyConstructor()) > + if (ClassDecl->needsOverloadResolutionForCopyConstructor() || > + ClassDecl->hasInheritedConstructor()) > DeclareImplicitCopyConstructor(ClassDecl); > } > > if (getLangOpts().CPlusPlus11 && > ClassDecl->needsImplicitMoveConstructor()) { > ++ASTContext::NumImplicitMoveConstructors; > > - if (ClassDecl->needsOverloadResolutionForMoveConstructor()) > + if (ClassDecl->needsOverloadResolutionForMoveConstructor() || > + ClassDecl->hasInheritedConstructor()) > DeclareImplicitMoveConstructor(ClassDecl); > } > > @@ -6480,7 +6488,8 @@ void Sema::AddImplicitlyDeclaredMembersT > // it shows up in the right place in the vtable and that we diagnose > // problems with the implicit exception specification. > if (ClassDecl->isDynamicClass() || > - ClassDecl->needsOverloadResolutionForCopyAssignment()) > + ClassDecl->needsOverloadResolutionForCopyAssignment() || > + ClassDecl->hasInheritedAssignment()) > DeclareImplicitCopyAssignment(ClassDecl); > } > > @@ -6489,7 +6498,8 @@ void Sema::AddImplicitlyDeclaredMembersT > > // Likewise for the move assignment operator. > if (ClassDecl->isDynamicClass() || > - ClassDecl->needsOverloadResolutionForMoveAssignment()) > + ClassDecl->needsOverloadResolutionForMoveAssignment() || > + ClassDecl->hasInheritedAssignment()) > DeclareImplicitMoveAssignment(ClassDecl); > } > > @@ -8898,10 +8908,11 @@ namespace { > struct DeclaringSpecialMember { > Sema &S; > Sema::SpecialMemberDecl D; > + Sema::ContextRAII SavedContext; > bool WasAlreadyBeingDeclared; > > DeclaringSpecialMember(Sema &S, CXXRecordDecl *RD, Sema::CXXSpecialMember > CSM) > - : S(S), D(RD, CSM) { > + : S(S), D(RD, CSM), SavedContext(S, RD) { > WasAlreadyBeingDeclared = > !S.SpecialMembersBeingDeclared.insert(D).second; > if (WasAlreadyBeingDeclared) > // This almost never happens, but if it does, ensure that our cache > @@ -8923,6 +8934,20 @@ struct DeclaringSpecialMember { > }; > } > > +void Sema::CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD) > { > + // Look up any existing declarations, but don't trigger declaration of all > + // implicit special members with this name. > + DeclarationName Name = FD->getDeclName(); > + LookupResult R(*this, Name, SourceLocation(), LookupOrdinaryName, > + ForRedeclaration); > + for (auto *D : FD->getParent()->lookup(Name)) > + if (auto *Acceptable = R.getAcceptableDecl(D)) > + R.addDecl(Acceptable); > + R.resolveKind(); > + > + CheckFunctionDeclaration(S, FD, R, /*IsExplicitSpecialization*/false); > +} > + > CXXConstructorDecl *Sema::DeclareImplicitDefaultConstructor( > CXXRecordDecl > *ClassDecl) { > // C++ [class.ctor]p5: > @@ -8971,13 +8996,16 @@ CXXConstructorDecl *Sema::DeclareImplici > // constructors is easy to compute. > DefaultCon->setTrivial(ClassDecl->hasTrivialDefaultConstructor()); > > - if (ShouldDeleteSpecialMember(DefaultCon, CXXDefaultConstructor)) > - SetDeclDeleted(DefaultCon, ClassLoc); > - > // Note that we have declared this constructor. > ++ASTContext::NumImplicitDefaultConstructorsDeclared; > > - if (Scope *S = getScopeForContext(ClassDecl)) > + Scope *S = getScopeForContext(ClassDecl); > + CheckImplicitSpecialMemberDeclaration(S, DefaultCon); > + > + if (ShouldDeleteSpecialMember(DefaultCon, CXXDefaultConstructor)) > + SetDeclDeleted(DefaultCon, ClassLoc); > + > + if (S) > PushOnScopeChains(DefaultCon, S, false); > ClassDecl->addDecl(DefaultCon); > > @@ -9433,20 +9461,21 @@ CXXDestructorDecl *Sema::DeclareImplicit > FunctionProtoType::ExtProtoInfo EPI = getImplicitMethodEPI(*this, > Destructor); > Destructor->setType(Context.getFunctionType(Context.VoidTy, None, EPI)); > > - AddOverriddenMethods(ClassDecl, Destructor); > - > // We don't need to use SpecialMemberIsTrivial here; triviality for > // destructors is easy to compute. > Destructor->setTrivial(ClassDecl->hasTrivialDestructor()); > > - if (ShouldDeleteSpecialMember(Destructor, CXXDestructor)) > - SetDeclDeleted(Destructor, ClassLoc); > - > // Note that we have declared this destructor. > ++ASTContext::NumImplicitDestructorsDeclared; > > + Scope *S = getScopeForContext(ClassDecl); > + CheckImplicitSpecialMemberDeclaration(S, Destructor); > + > + if (ShouldDeleteSpecialMember(Destructor, CXXDestructor)) > + SetDeclDeleted(Destructor, ClassLoc); > + > // Introduce this destructor into its scope. > - if (Scope *S = getScopeForContext(ClassDecl)) > + if (S) > PushOnScopeChains(Destructor, S, false); > ClassDecl->addDecl(Destructor); > > @@ -10147,20 +10176,21 @@ CXXMethodDecl *Sema::DeclareImplicitCopy > nullptr); > CopyAssignment->setParams(FromParam); > > - AddOverriddenMethods(ClassDecl, CopyAssignment); > - > CopyAssignment->setTrivial( > ClassDecl->needsOverloadResolutionForCopyAssignment() > ? SpecialMemberIsTrivial(CopyAssignment, CXXCopyAssignment) > : ClassDecl->hasTrivialCopyAssignment()); > > - if (ShouldDeleteSpecialMember(CopyAssignment, CXXCopyAssignment)) > - SetDeclDeleted(CopyAssignment, ClassLoc); > - > // Note that we have added this copy-assignment operator. > ++ASTContext::NumImplicitCopyAssignmentOperatorsDeclared; > > - if (Scope *S = getScopeForContext(ClassDecl)) > + Scope *S = getScopeForContext(ClassDecl); > + CheckImplicitSpecialMemberDeclaration(S, CopyAssignment); > + > + if (ShouldDeleteSpecialMember(CopyAssignment, CXXCopyAssignment)) > + SetDeclDeleted(CopyAssignment, ClassLoc); > + > + if (S) > PushOnScopeChains(CopyAssignment, S, false); > ClassDecl->addDecl(CopyAssignment); > > @@ -10538,22 +10568,23 @@ CXXMethodDecl *Sema::DeclareImplicitMove > nullptr); > MoveAssignment->setParams(FromParam); > > - AddOverriddenMethods(ClassDecl, MoveAssignment); > - > MoveAssignment->setTrivial( > ClassDecl->needsOverloadResolutionForMoveAssignment() > ? SpecialMemberIsTrivial(MoveAssignment, CXXMoveAssignment) > : ClassDecl->hasTrivialMoveAssignment()); > > + // Note that we have added this copy-assignment operator. > + ++ASTContext::NumImplicitMoveAssignmentOperatorsDeclared; > + > + Scope *S = getScopeForContext(ClassDecl); > + CheckImplicitSpecialMemberDeclaration(S, MoveAssignment); > + > if (ShouldDeleteSpecialMember(MoveAssignment, CXXMoveAssignment)) { > ClassDecl->setImplicitMoveAssignmentIsDeleted(); > SetDeclDeleted(MoveAssignment, ClassLoc); > } > > - // Note that we have added this copy-assignment operator. > - ++ASTContext::NumImplicitMoveAssignmentOperatorsDeclared; > - > - if (Scope *S = getScopeForContext(ClassDecl)) > + if (S) > PushOnScopeChains(MoveAssignment, S, false); > ClassDecl->addDecl(MoveAssignment); > > @@ -10979,13 +11010,16 @@ CXXConstructorDecl *Sema::DeclareImplici > ? SpecialMemberIsTrivial(CopyConstructor, CXXCopyConstructor) > : ClassDecl->hasTrivialCopyConstructor()); > > - if (ShouldDeleteSpecialMember(CopyConstructor, CXXCopyConstructor)) > - SetDeclDeleted(CopyConstructor, ClassLoc); > - > // Note that we have declared this constructor. > ++ASTContext::NumImplicitCopyConstructorsDeclared; > > - if (Scope *S = getScopeForContext(ClassDecl)) > + Scope *S = getScopeForContext(ClassDecl); > + CheckImplicitSpecialMemberDeclaration(S, CopyConstructor); > + > + if (ShouldDeleteSpecialMember(CopyConstructor, CXXCopyConstructor)) > + SetDeclDeleted(CopyConstructor, ClassLoc); > + > + if (S) > PushOnScopeChains(CopyConstructor, S, false); > ClassDecl->addDecl(CopyConstructor); > > @@ -11156,15 +11190,18 @@ CXXConstructorDecl *Sema::DeclareImplici > ? SpecialMemberIsTrivial(MoveConstructor, CXXMoveConstructor) > : ClassDecl->hasTrivialMoveConstructor()); > > + // Note that we have declared this constructor. > + ++ASTContext::NumImplicitMoveConstructorsDeclared; > + > + Scope *S = getScopeForContext(ClassDecl); > + CheckImplicitSpecialMemberDeclaration(S, MoveConstructor); > + > if (ShouldDeleteSpecialMember(MoveConstructor, CXXMoveConstructor)) { > ClassDecl->setImplicitMoveConstructorIsDeleted(); > SetDeclDeleted(MoveConstructor, ClassLoc); > } > > - // Note that we have declared this constructor. > - ++ASTContext::NumImplicitMoveConstructorsDeclared; > - > - if (Scope *S = getScopeForContext(ClassDecl)) > + if (S) > PushOnScopeChains(MoveConstructor, S, false); > ClassDecl->addDecl(MoveConstructor); > > > Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Fri May 13 01:47:56 2016 > @@ -1466,6 +1466,8 @@ void ASTDeclReader::ReadCXXDefinitionDat > Data.HasInClassInitializer = Record[Idx++]; > Data.HasUninitializedReferenceMember = Record[Idx++]; > Data.HasUninitializedFields = Record[Idx++]; > + Data.HasInheritedConstructor = Record[Idx++]; > + Data.HasInheritedAssignment = Record[Idx++]; > Data.NeedOverloadResolutionForMoveConstructor = Record[Idx++]; > Data.NeedOverloadResolutionForMoveAssignment = Record[Idx++]; > Data.NeedOverloadResolutionForDestructor = Record[Idx++]; > @@ -1593,6 +1595,8 @@ void ASTDeclReader::MergeDefinitionData( > MATCH_FIELD(HasInClassInitializer) > MATCH_FIELD(HasUninitializedReferenceMember) > MATCH_FIELD(HasUninitializedFields) > + MATCH_FIELD(HasInheritedConstructor) > + MATCH_FIELD(HasInheritedAssignment) > MATCH_FIELD(NeedOverloadResolutionForMoveConstructor) > MATCH_FIELD(NeedOverloadResolutionForMoveAssignment) > MATCH_FIELD(NeedOverloadResolutionForDestructor) > > Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri May 13 01:47:56 2016 > @@ -5489,6 +5489,8 @@ void ASTRecordWriter::AddCXXDefinitionDa > Record->push_back(Data.HasInClassInitializer); > Record->push_back(Data.HasUninitializedReferenceMember); > Record->push_back(Data.HasUninitializedFields); > + Record->push_back(Data.HasInheritedConstructor); > + Record->push_back(Data.HasInheritedAssignment); > Record->push_back(Data.NeedOverloadResolutionForMoveConstructor); > Record->push_back(Data.NeedOverloadResolutionForMoveAssignment); > Record->push_back(Data.NeedOverloadResolutionForDestructor); > > Modified: cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p12.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p12.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p12.cpp > (original) > +++ cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p12.cpp Fri > May 13 01:47:56 2016 > @@ -1,3 +1,5 @@ > +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s > +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s > // RUN: %clang_cc1 -fsyntax-only -verify %s > > // C++03 [namespace.udecl]p12: > @@ -161,3 +163,33 @@ namespace test4 { > d.bar<int>(3); // expected-error {{'bar' is a protected member}} > } > } > + > +namespace test5 { > + struct Derived; > + struct Base { > + void operator=(const Derived&); > + }; > + struct Derived : Base { > + // Hidden by implicit derived class operator. > + using Base::operator=; > + }; > + void f(Derived d) { > + d = d; > + } > +} > + > +#if __cplusplus >= 201103L > +namespace test6 { > + struct Derived; > + struct Base { > + void operator=(Derived&&); > + }; > + struct Derived : Base { > + // Hidden by implicit derived class operator. > + using Base::operator=; > + }; > + void f(Derived d) { > + d = Derived(); > + } > +} > +#endif > > Modified: cfe/trunk/test/SemaCUDA/implicit-member-target.cu > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/implicit-member-target.cu?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/test/SemaCUDA/implicit-member-target.cu (original) > +++ cfe/trunk/test/SemaCUDA/implicit-member-target.cu Fri May 13 01:47:56 2016 > @@ -60,13 +60,14 @@ struct A3_with_device_ctors { > > struct B3_with_implicit_ctors : A3_with_device_ctors { > }; > +// expected-note@-2 2{{call to __device__ function from __host__ function}} > +// expected-note@-3 {{default constructor}} > > -// expected-note@-3 {{copy constructor of 'B3_with_implicit_ctors' is > implicitly deleted}} > > void hostfoo3() { > B3_with_implicit_ctors b; // this is OK because the inferred default ctor > // here is __host__ > - B3_with_implicit_ctors b2 = b; // expected-error {{call to > implicitly-deleted copy constructor}} > + B3_with_implicit_ctors b2 = b; // expected-error {{no matching > constructor}} > > } > > > Modified: cfe/trunk/test/SemaCXX/constructor-recovery.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constructor-recovery.cpp?rev=269398&r1=269397&r2=269398&view=diff > ============================================================================== > --- cfe/trunk/test/SemaCXX/constructor-recovery.cpp (original) > +++ cfe/trunk/test/SemaCXX/constructor-recovery.cpp Fri May 13 01:47:56 2016 > @@ -1,9 +1,9 @@ > // RUN: %clang_cc1 -fsyntax-only -verify %s > > -struct C { > +struct C { // expected-note 1+{{candidate}} > virtual C() = 0; // expected-error{{constructor cannot be declared > 'virtual'}} > }; > > void f() { > - C c; > + C c; // expected-error {{no matching constructor}} > } > > > _______________________________________________ > cfe-commits mailing > listcfe-comm...@lists.llvm.orghttp://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