r290092 - Revert "[c++1z] P0195R2: Support pack-expansion of using-declarations."

Daniel Jasper via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 19 02:09:26 PST 2016


Author: djasper
Date: Mon Dec 19 04:09:25 2016
New Revision: 290092

URL: http://llvm.org/viewvc/llvm-project?rev=290092&view=rev
Log:
Revert "[c++1z] P0195R2: Support pack-expansion of using-declarations."

This reverts commit r290080 as it leads to many Clang crashes, e.g.:
http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/1814

Removed:
    cfe/trunk/test/PCH/cxx1z-using-declaration.cpp
    cfe/trunk/test/SemaTemplate/cxx1z-using-declaration.cpp
Modified:
    cfe/trunk/include/clang/AST/DeclCXX.h
    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
    cfe/trunk/include/clang/Basic/DeclNodes.td
    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/include/clang/Parse/Parser.h
    cfe/trunk/include/clang/Sema/Sema.h
    cfe/trunk/include/clang/Sema/Template.h
    cfe/trunk/include/clang/Serialization/ASTBitCodes.h
    cfe/trunk/lib/AST/DeclBase.cpp
    cfe/trunk/lib/AST/DeclCXX.cpp
    cfe/trunk/lib/CodeGen/CGDecl.cpp
    cfe/trunk/lib/Parse/ParseDeclCXX.cpp
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/lib/Sema/SemaExprCXX.cpp
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
    cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
    cfe/trunk/lib/Sema/TreeTransform.h
    cfe/trunk/lib/Serialization/ASTCommon.cpp
    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
    cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
    cfe/trunk/test/Parser/cxx1z-using-declaration.cpp
    cfe/trunk/tools/libclang/CIndex.cpp

Modified: cfe/trunk/include/clang/AST/DeclCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclCXX.h (original)
+++ cfe/trunk/include/clang/AST/DeclCXX.h Mon Dec 19 04:09:25 2016
@@ -3140,77 +3140,6 @@ public:
   friend class ASTDeclWriter;
 };
 
-/// Represents a pack of using declarations that a single
-/// using-declarator pack-expanded into.
-///
-/// \code
-/// template<typename ...T> struct X : T... {
-///   using T::operator()...;
-///   using T::operator T...;
-/// };
-/// \endcode
-///
-/// In the second case above, the UsingPackDecl will have the name
-/// 'operator T' (which contains an unexpanded pack), but the individual
-/// UsingDecls and UsingShadowDecls will have more reasonable names.
-class UsingPackDecl final
-    : public NamedDecl, public Mergeable<UsingPackDecl>,
-      private llvm::TrailingObjects<UsingPackDecl, NamedDecl *> {
-  void anchor() override;
-
-  /// The UnresolvedUsingValueDecl or UnresolvedUsingTypenameDecl from
-  /// which this waas instantiated.
-  NamedDecl *InstantiatedFrom;
-
-  /// The number of using-declarations created by this pack expansion.
-  unsigned NumExpansions;
-
-  UsingPackDecl(DeclContext *DC, NamedDecl *InstantiatedFrom,
-                ArrayRef<NamedDecl *> UsingDecls)
-      : NamedDecl(UsingPack, DC,
-                  InstantiatedFrom ? InstantiatedFrom->getLocation()
-                                   : SourceLocation(),
-                  InstantiatedFrom ? InstantiatedFrom->getDeclName()
-                                   : DeclarationName()),
-        InstantiatedFrom(InstantiatedFrom), NumExpansions(UsingDecls.size()) {
-    std::uninitialized_copy(UsingDecls.begin(), UsingDecls.end(),
-                            getTrailingObjects<NamedDecl *>());
-  }
-
-public:
-  /// Get the using declaration from which this was instantiated. This will
-  /// always be an UnresolvedUsingValueDecl or an UnresolvedUsingTypenameDecl
-  /// that is a pack expansion.
-  NamedDecl *getInstantiatedFromUsingDecl() { return InstantiatedFrom; }
-
-  /// Get the set of using declarations that this pack expanded into. Note that
-  /// some of these may still be unresolved.
-  ArrayRef<NamedDecl *> expansions() const {
-    return llvm::makeArrayRef(getTrailingObjects<NamedDecl *>(), NumExpansions);
-  }
-
-  static UsingPackDecl *Create(ASTContext &C, DeclContext *DC,
-                               NamedDecl *InstantiatedFrom,
-                               ArrayRef<NamedDecl *> UsingDecls);
-
-  static UsingPackDecl *CreateDeserialized(ASTContext &C, unsigned ID,
-                                           unsigned NumExpansions);
-
-  SourceRange getSourceRange() const override LLVM_READONLY {
-    return InstantiatedFrom->getSourceRange();
-  }
-
-  UsingPackDecl *getCanonicalDecl() override { return getFirstDecl(); }
-  const UsingPackDecl *getCanonicalDecl() const { return getFirstDecl(); }
-
-  static bool classof(const Decl *D) { return classofKind(D->getKind()); }
-  static bool classofKind(Kind K) { return K == UsingPack; }
-
-  friend class ASTDeclReader;
-  friend class ASTDeclWriter;
-  friend TrailingObjects;
-};
-
 /// \brief Represents a dependent using declaration which was not marked with
 /// \c typename.
 ///
@@ -3229,9 +3158,6 @@ class UnresolvedUsingValueDecl : public
   /// \brief The source location of the 'using' keyword
   SourceLocation UsingLocation;
 
-  /// \brief If this is a pack expansion, the location of the '...'.
-  SourceLocation EllipsisLoc;
-
   /// \brief The nested-name-specifier that precedes the name.
   NestedNameSpecifierLoc QualifierLoc;
 
@@ -3242,12 +3168,11 @@ class UnresolvedUsingValueDecl : public
   UnresolvedUsingValueDecl(DeclContext *DC, QualType Ty,
                            SourceLocation UsingLoc,
                            NestedNameSpecifierLoc QualifierLoc,
-                           const DeclarationNameInfo &NameInfo,
-                           SourceLocation EllipsisLoc)
+                           const DeclarationNameInfo &NameInfo)
     : ValueDecl(UnresolvedUsingValue, DC,
                 NameInfo.getLoc(), NameInfo.getName(), Ty),
-      UsingLocation(UsingLoc), EllipsisLoc(EllipsisLoc),
-      QualifierLoc(QualifierLoc), DNLoc(NameInfo.getInfo())
+      UsingLocation(UsingLoc), QualifierLoc(QualifierLoc),
+      DNLoc(NameInfo.getInfo())
   { }
 
 public:
@@ -3273,20 +3198,10 @@ public:
     return DeclarationNameInfo(getDeclName(), getLocation(), DNLoc);
   }
 
-  /// \brief Determine whether this is a pack expansion.
-  bool isPackExpansion() const {
-    return EllipsisLoc.isValid();
-  }
-
-  /// \brief Get the location of the ellipsis if this is a pack expansion.
-  SourceLocation getEllipsisLoc() const {
-    return EllipsisLoc;
-  }
-
   static UnresolvedUsingValueDecl *
     Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc,
            NestedNameSpecifierLoc QualifierLoc,
-           const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc);
+           const DeclarationNameInfo &NameInfo);
 
   static UnresolvedUsingValueDecl *
   CreateDeserialized(ASTContext &C, unsigned ID);
@@ -3327,9 +3242,6 @@ class UnresolvedUsingTypenameDecl
   /// \brief The source location of the 'typename' keyword
   SourceLocation TypenameLocation;
 
-  /// \brief If this is a pack expansion, the location of the '...'.
-  SourceLocation EllipsisLoc;
-
   /// \brief The nested-name-specifier that precedes the name.
   NestedNameSpecifierLoc QualifierLoc;
 
@@ -3337,12 +3249,10 @@ class UnresolvedUsingTypenameDecl
                               SourceLocation TypenameLoc,
                               NestedNameSpecifierLoc QualifierLoc,
                               SourceLocation TargetNameLoc,
-                              IdentifierInfo *TargetName,
-                              SourceLocation EllipsisLoc)
+                              IdentifierInfo *TargetName)
     : TypeDecl(UnresolvedUsingTypename, DC, TargetNameLoc, TargetName,
                UsingLoc),
-      TypenameLocation(TypenameLoc), EllipsisLoc(EllipsisLoc),
-      QualifierLoc(QualifierLoc) { }
+      TypenameLocation(TypenameLoc), QualifierLoc(QualifierLoc) { }
 
   friend class ASTDeclReader;
 
@@ -3362,25 +3272,10 @@ public:
     return QualifierLoc.getNestedNameSpecifier();
   }
 
-  DeclarationNameInfo getNameInfo() const {
-    return DeclarationNameInfo(getDeclName(), getLocation());
-  }
-
-  /// \brief Determine whether this is a pack expansion.
-  bool isPackExpansion() const {
-    return EllipsisLoc.isValid();
-  }
-
-  /// \brief Get the location of the ellipsis if this is a pack expansion.
-  SourceLocation getEllipsisLoc() const {
-    return EllipsisLoc;
-  }
-
   static UnresolvedUsingTypenameDecl *
     Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc,
            SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc,
-           SourceLocation TargetNameLoc, DeclarationName TargetName,
-           SourceLocation EllipsisLoc);
+           SourceLocation TargetNameLoc, DeclarationName TargetName);
 
   static UnresolvedUsingTypenameDecl *
   CreateDeserialized(ASTContext &C, unsigned ID);

Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
+++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Dec 19 04:09:25 2016
@@ -1505,8 +1505,6 @@ DEF_TRAVERSE_DECL(UsingDecl, {
   TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
 })
 
-DEF_TRAVERSE_DECL(UsingPackDecl, {})
-
 DEF_TRAVERSE_DECL(UsingDirectiveDecl, {
   TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
 })

Modified: cfe/trunk/include/clang/Basic/DeclNodes.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DeclNodes.td?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DeclNodes.td (original)
+++ cfe/trunk/include/clang/Basic/DeclNodes.td Mon Dec 19 04:09:25 2016
@@ -67,7 +67,6 @@ def Named : Decl<1>;
     def TemplateTemplateParm : DDecl<Template>;
     def BuiltinTemplate : DDecl<Template>;
   def Using : DDecl<Named>;
-  def UsingPack : DDecl<Named>;
   def UsingShadow : DDecl<Named>;
     def ConstructorUsingShadow : DDecl<UsingShadow>;
   def ObjCMethod : DDecl<Named>, DeclContext;

Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Mon Dec 19 04:09:25 2016
@@ -740,8 +740,6 @@ def err_alias_declaration_not_identifier
   "name defined in alias declaration must be an identifier">;
 def err_alias_declaration_specialization : Error<
   "%select{partial specialization|explicit specialization|explicit instantiation}0 of alias templates is not permitted">;
-def err_alias_declaration_pack_expansion : Error<
-  "alias declaration cannot be a pack expansion">;
 
 // C++1z using-declaration pack expansions
 def ext_multi_using_declaration : ExtWarn<
@@ -751,11 +749,6 @@ def warn_cxx1z_compat_multi_using_declar
   "use of multiple declarators in a single using declaration is "
   "incompatible with C++ standards before C++1z">,
   InGroup<CXXPre1zCompat>, DefaultIgnore;
-def ext_using_declaration_pack : ExtWarn<
-  "pack expansion of using declaration is a C++1z extension">, InGroup<CXX1z>;
-def warn_cxx1z_compat_using_declaration_pack : Warning<
-  "pack expansion using declaration is incompatible with C++ standards "
-  "before C++1z">, InGroup<CXXPre1zCompat>, DefaultIgnore;
 
 // C++11 override control
 def ext_override_control_keyword : ExtWarn<

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Dec 19 04:09:25 2016
@@ -474,8 +474,6 @@ def err_using_decl_conflict : Error<
 def err_using_decl_conflict_reverse : Error<
   "declaration conflicts with target of using declaration already in scope">;
 def note_using_decl : Note<"%select{|previous }0using declaration">;
-def err_using_decl_redeclaration_expansion : Error<
-  "using declaration pack expansion at block scope produces multiple values">;
 
 def warn_access_decl_deprecated : Warning<
   "access declarations are deprecated; use using declarations instead">,
@@ -4157,9 +4155,6 @@ def err_variable_instantiates_to_functio
 def err_nested_name_spec_non_tag : Error<
   "type %0 cannot be used prior to '::' because it has no members">;
 
-def err_using_pack_expansion_empty : Error<
-  "%select{|member}0 using declaration %1 instantiates to an empty pack">;
-
 // C++ Explicit Instantiation
 def err_explicit_instantiation_duplicate : Error<
     "duplicate explicit instantiation of %0">;

Modified: cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/trunk/include/clang/Parse/Parser.h Mon Dec 19 04:09:25 2016
@@ -2436,10 +2436,9 @@ private:
     CXXScopeSpec SS;
     SourceLocation TemplateKWLoc;
     UnqualifiedId Name;
-    SourceLocation EllipsisLoc;
 
     void clear() {
-      TypenameLoc = TemplateKWLoc = EllipsisLoc = SourceLocation();
+      TypenameLoc = TemplateKWLoc = SourceLocation();
       SS.clear();
       Name.clear();
     }
@@ -2451,6 +2450,9 @@ private:
                                        SourceLocation UsingLoc,
                                        SourceLocation &DeclEnd,
                                        AccessSpecifier AS = AS_none);
+  Decl *ParseAliasTemplate(const ParsedTemplateInfo &TemplateInfo,
+                           SourceLocation &DeclEnd, AccessSpecifier AS,
+                           ParsedAttributesWithRange &MisplacedAttrs1);
   Decl *ParseAliasDeclarationAfterDeclarator(
       const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc,
       UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS,

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Mon Dec 19 04:09:25 2016
@@ -4324,15 +4324,12 @@ public:
 
   NamedDecl *BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
                                    SourceLocation UsingLoc,
-                                   bool HasTypenameKeyword,
-                                   SourceLocation TypenameLoc,
                                    CXXScopeSpec &SS,
                                    DeclarationNameInfo NameInfo,
-                                   SourceLocation EllipsisLoc,
                                    AttributeList *AttrList,
-                                   bool IsInstantiation);
-  NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
-                                ArrayRef<NamedDecl *> Expansions);
+                                   bool IsInstantiation,
+                                   bool HasTypenameKeyword,
+                                   SourceLocation TypenameLoc);
 
   bool CheckInheritingConstructorUsingDecl(UsingDecl *UD);
 
@@ -4346,11 +4343,10 @@ public:
   Decl *ActOnUsingDeclaration(Scope *CurScope,
                               AccessSpecifier AS,
                               SourceLocation UsingLoc,
-                              SourceLocation TypenameLoc,
                               CXXScopeSpec &SS,
                               UnqualifiedId &Name,
-                              SourceLocation EllipsisLoc,
-                              AttributeList *AttrList);
+                              AttributeList *AttrList,
+                              SourceLocation TypenameLoc);
   Decl *ActOnAliasDeclaration(Scope *CurScope,
                               AccessSpecifier AS,
                               MultiTemplateParamsArg TemplateParams,
@@ -6355,7 +6351,7 @@ public:
   ///
   /// \param SS The nested-name-specifier that will be traversed to find
   /// unexpanded parameter packs.
-  void collectUnexpandedParameterPacks(NestedNameSpecifierLoc NNS,
+  void collectUnexpandedParameterPacks(CXXScopeSpec &SS,
                          SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
 
   /// \brief Collect the set of unexpanded parameter packs within the given

Modified: cfe/trunk/include/clang/Sema/Template.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Template.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Template.h (original)
+++ cfe/trunk/include/clang/Sema/Template.h Mon Dec 19 04:09:25 2016
@@ -515,11 +515,6 @@ namespace clang {
         VarTemplateDecl *VarTemplate,
         VarTemplatePartialSpecializationDecl *PartialSpec);
     void InstantiateEnumDefinition(EnumDecl *Enum, EnumDecl *Pattern);
-
-  private:
-    template<typename T>
-    Decl *instantiateUnresolvedUsingDecl(T *D,
-                                         bool InstantiatingPackElement = false);
   };  
 }
 

Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Mon Dec 19 04:09:25 2016
@@ -1103,8 +1103,6 @@ namespace clang {
       DECL_NAMESPACE_ALIAS,
       /// \brief A UsingDecl record.
       DECL_USING,
-      /// \brief A UsingPackDecl record.
-      DECL_USING_PACK,
       /// \brief A UsingShadowDecl record.
       DECL_USING_SHADOW,
       /// \brief A ConstructorUsingShadowDecl record.

Modified: cfe/trunk/lib/AST/DeclBase.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclBase.cpp (original)
+++ cfe/trunk/lib/AST/DeclBase.cpp Mon Dec 19 04:09:25 2016
@@ -651,13 +651,11 @@ unsigned Decl::getIdentifierNamespaceFor
     case Typedef:
     case TypeAlias:
     case TypeAliasTemplate:
+    case UnresolvedUsingTypename:
     case TemplateTypeParm:
     case ObjCTypeParam:
       return IDNS_Ordinary | IDNS_Type;
 
-    case UnresolvedUsingTypename:
-      return IDNS_Ordinary | IDNS_Type | IDNS_Using;
-
     case UsingShadow:
       return 0; // we'll actually overwrite this later
 
@@ -665,7 +663,6 @@ unsigned Decl::getIdentifierNamespaceFor
       return IDNS_Ordinary | IDNS_Using;
 
     case Using:
-    case UsingPack:
       return IDNS_Using;
 
     case ObjCProtocol:

Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Dec 19 04:09:25 2016
@@ -2250,37 +2250,15 @@ SourceRange UsingDecl::getSourceRange()
   return SourceRange(Begin, getNameInfo().getEndLoc());
 }
 
-void UsingPackDecl::anchor() { }
-
-UsingPackDecl *UsingPackDecl::Create(ASTContext &C, DeclContext *DC,
-                                     NamedDecl *InstantiatedFrom,
-                                     ArrayRef<NamedDecl *> UsingDecls) {
-  size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
-  return new (C, DC, Extra) UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
-}
-
-UsingPackDecl *UsingPackDecl::CreateDeserialized(ASTContext &C, unsigned ID,
-                                                 unsigned NumExpansions) {
-  size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
-  auto *Result = new (C, ID, Extra) UsingPackDecl(nullptr, nullptr, None);
-  Result->NumExpansions = NumExpansions;
-  auto *Trail = Result->getTrailingObjects<NamedDecl *>();
-  for (unsigned I = 0; I != NumExpansions; ++I)
-    new (Trail + I) NamedDecl*(nullptr);
-  return Result;
-}
-
 void UnresolvedUsingValueDecl::anchor() { }
 
 UnresolvedUsingValueDecl *
 UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
                                  SourceLocation UsingLoc,
                                  NestedNameSpecifierLoc QualifierLoc,
-                                 const DeclarationNameInfo &NameInfo,
-                                 SourceLocation EllipsisLoc) {
+                                 const DeclarationNameInfo &NameInfo) {
   return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
-                                              QualifierLoc, NameInfo,
-                                              EllipsisLoc);
+                                              QualifierLoc, NameInfo);
 }
 
 UnresolvedUsingValueDecl *
@@ -2288,8 +2266,7 @@ UnresolvedUsingValueDecl::CreateDeserial
   return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
                                               SourceLocation(),
                                               NestedNameSpecifierLoc(),
-                                              DeclarationNameInfo(),
-                                              SourceLocation());
+                                              DeclarationNameInfo());
 }
 
 SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
@@ -2306,18 +2283,17 @@ UnresolvedUsingTypenameDecl::Create(ASTC
                                     SourceLocation TypenameLoc,
                                     NestedNameSpecifierLoc QualifierLoc,
                                     SourceLocation TargetNameLoc,
-                                    DeclarationName TargetName,
-                                    SourceLocation EllipsisLoc) {
+                                    DeclarationName TargetName) {
   return new (C, DC) UnresolvedUsingTypenameDecl(
       DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
-      TargetName.getAsIdentifierInfo(), EllipsisLoc);
+      TargetName.getAsIdentifierInfo());
 }
 
 UnresolvedUsingTypenameDecl *
 UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
   return new (C, ID) UnresolvedUsingTypenameDecl(
       nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
-      SourceLocation(), nullptr, SourceLocation());
+      SourceLocation(), nullptr);
 }
 
 void StaticAssertDecl::anchor() { }

Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Mon Dec 19 04:09:25 2016
@@ -113,10 +113,6 @@ void CodeGenFunction::EmitDecl(const Dec
     if (CGDebugInfo *DI = getDebugInfo())
         DI->EmitUsingDecl(cast<UsingDecl>(D));
     return;
-  case Decl::UsingPack:
-    for (auto *Using : cast<UsingPackDecl>(D).expansions())
-      EmitDecl(*Using);
-    return;
   case Decl::UsingDirective: // using namespace X; [C++]
     if (CGDebugInfo *DI = getDebugInfo())
       DI->EmitUsingDirective(cast<UsingDirectiveDecl>(D));

Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Mon Dec 19 04:09:25 2016
@@ -560,9 +560,7 @@ bool Parser::ParseUsingDeclarator(unsign
   //   nested-name-specifier, the name is [...] considered to name the
   //   constructor.
   if (getLangOpts().CPlusPlus11 && Context == Declarator::MemberContext &&
-      Tok.is(tok::identifier) &&
-      (NextToken().is(tok::semi) || NextToken().is(tok::comma) ||
-       NextToken().is(tok::ellipsis)) &&
+      Tok.is(tok::identifier) && NextToken().is(tok::semi) &&
       D.SS.isNotEmpty() && LastII == Tok.getIdentifierInfo() &&
       !D.SS.getScopeRep()->getAsNamespace() &&
       !D.SS.getScopeRep()->getAsNamespaceAlias()) {
@@ -580,10 +578,7 @@ bool Parser::ParseUsingDeclarator(unsign
       return true;
   }
 
-  if (TryConsumeToken(tok::ellipsis, D.EllipsisLoc))
-    Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z ?
-         diag::warn_cxx1z_compat_using_declaration_pack :
-         diag::ext_using_declaration_pack);
+  // FIXME: Parse optional ellipsis
 
   return false;
 }
@@ -683,9 +678,9 @@ Parser::ParseUsingDeclaration(unsigned C
         D.TypenameLoc = SourceLocation();
       }
 
-      Decl *UD = Actions.ActOnUsingDeclaration(getCurScope(), AS, UsingLoc,
-                                               D.TypenameLoc, D.SS, D.Name,
-                                               D.EllipsisLoc, Attrs.getList());
+      Decl *UD =
+          Actions.ActOnUsingDeclaration(getCurScope(), AS, UsingLoc, D.SS,
+                                        D.Name, Attrs.getList(), D.TypenameLoc);
       if (UD)
         DeclsInGroup.push_back(UD);
     }
@@ -713,6 +708,62 @@ Parser::ParseUsingDeclaration(unsigned C
   return Actions.BuildDeclaratorGroup(DeclsInGroup, /*MayContainAuto*/false);
 }
 
+Decl *Parser::ParseAliasTemplate(const ParsedTemplateInfo &TemplateInfo,
+                                 SourceLocation &DeclEnd, AccessSpecifier AS,
+                                 ParsedAttributesWithRange &MisplacedAttrs1) {
+  assert(Tok.is(tok::kw_using) && "Not using token");
+  ObjCDeclContextSwitch ObjCDC(*this);
+  
+  // Eat 'using'.
+  SourceLocation UsingLoc = ConsumeToken();
+  if (Tok.is(tok::code_completion)) {
+    Actions.CodeCompleteUsing(getCurScope());
+    cutOffParsing();
+    return nullptr;
+  }
+
+  // 'using namespace' means this is a using-directive.
+  if (Tok.is(tok::kw_namespace)) {
+    SourceRange R = TemplateInfo.getSourceRange();
+    Diag(UsingLoc, diag::err_templated_using_directive_declaration)
+        << 0 /* directive */ << R;
+    SkipUntil(tok::semi);
+    return nullptr;
+  }
+
+  // Check for misplaced attributes before the identifier.
+  ParsedAttributesWithRange MisplacedAttrs2(AttrFactory);
+  MaybeParseCXX11Attributes(MisplacedAttrs2);
+
+  // FIXME: Just parse an identifier here?
+  UsingDeclarator D;
+  if (ParseUsingDeclarator(Declarator::FileContext, D)) {
+    SkipUntil(tok::semi);
+    return nullptr;
+  }
+
+  ParsedAttributesWithRange Attrs(AttrFactory);
+
+  // If we had any misplaced attributes from earlier, this is where they
+  // should have been written.
+  for (auto *MisplacedAttrs : {&MisplacedAttrs1, &MisplacedAttrs2}) {
+    if (MisplacedAttrs->Range.isValid()) {
+      Diag(MisplacedAttrs->Range.getBegin(), diag::err_attributes_not_allowed)
+        << FixItHint::CreateInsertionFromRange(
+               Tok.getLocation(),
+               CharSourceRange::getTokenRange(MisplacedAttrs->Range))
+        << FixItHint::CreateRemoval(MisplacedAttrs->Range);
+      Attrs.takeAllFrom(*MisplacedAttrs);
+    }
+  }
+
+  MaybeParseGNUAttributes(Attrs);
+  MaybeParseCXX11Attributes(Attrs);
+
+  return ParseAliasDeclarationAfterDeclarator(TemplateInfo, UsingLoc, D,
+                                              DeclEnd, AS, Attrs);
+}
+
 Decl *Parser::ParseAliasDeclarationAfterDeclarator(
     const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc,
     UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS,
@@ -762,9 +813,6 @@ Decl *Parser::ParseAliasDeclarationAfter
   else if (D.SS.isNotEmpty())
     Diag(D.SS.getBeginLoc(), diag::err_alias_declaration_not_identifier)
       << FixItHint::CreateRemoval(D.SS.getRange());
-  if (D.EllipsisLoc.isValid())
-    Diag(D.EllipsisLoc, diag::err_alias_declaration_pack_expansion)
-      << FixItHint::CreateRemoval(SourceRange(D.EllipsisLoc));
 
   Decl *DeclFromDeclSpec = nullptr;
   TypeResult TypeAlias =
@@ -2439,9 +2487,8 @@ Parser::ParseCXXClassMemberDeclaration(A
       }
 
       return DeclGroupPtrTy::make(DeclGroupRef(Actions.ActOnUsingDeclaration(
-          getCurScope(), AS, /*UsingLoc*/ SourceLocation(),
-          /*TypenameLoc*/ SourceLocation(), SS, Name,
-          /*EllipsisLoc*/ SourceLocation(), /*AttrList*/ nullptr)));
+          getCurScope(), AS, /*UsingLoc*/SourceLocation(), SS, Name,
+          /*AttrList*/nullptr, /*TypenameLoc*/SourceLocation())));
     }
   }
 

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Dec 19 04:09:25 2016
@@ -8533,18 +8533,12 @@ void Sema::PushUsingDirective(Scope *S,
 Decl *Sema::ActOnUsingDeclaration(Scope *S,
                                   AccessSpecifier AS,
                                   SourceLocation UsingLoc,
-                                  SourceLocation TypenameLoc,
                                   CXXScopeSpec &SS,
                                   UnqualifiedId &Name,
-                                  SourceLocation EllipsisLoc,
-                                  AttributeList *AttrList) {
+                                  AttributeList *AttrList,
+                                  SourceLocation TypenameLoc) {
   assert(S->getFlags() & Scope::DeclScope && "Invalid Scope.");
 
-  if (SS.isEmpty()) {
-    Diag(Name.getLocStart(), diag::err_using_requires_qualname);
-    return nullptr;
-  }
-
   switch (Name.getKind()) {
   case UnqualifiedId::IK_ImplicitSelfParam:
   case UnqualifiedId::IK_Identifier:
@@ -8590,23 +8584,14 @@ Decl *Sema::ActOnUsingDeclaration(Scope
       << FixItHint::CreateInsertion(SS.getRange().getBegin(), "using ");
   }
 
-  if (EllipsisLoc.isInvalid()) {
-    if (DiagnoseUnexpandedParameterPack(SS, UPPC_UsingDeclaration) ||
-        DiagnoseUnexpandedParameterPack(TargetNameInfo, UPPC_UsingDeclaration))
-      return nullptr;
-  } else {
-    if (!SS.getScopeRep()->containsUnexpandedParameterPack() &&
-        !TargetNameInfo.containsUnexpandedParameterPack()) {
-      Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
-        << SourceRange(SS.getBeginLoc(), TargetNameInfo.getEndLoc());
-      EllipsisLoc = SourceLocation();
-    }
-  }
+  if (DiagnoseUnexpandedParameterPack(SS, UPPC_UsingDeclaration) ||
+      DiagnoseUnexpandedParameterPack(TargetNameInfo, UPPC_UsingDeclaration))
+    return nullptr;
 
-  NamedDecl *UD =
-      BuildUsingDeclaration(S, AS, UsingLoc, TypenameLoc.isValid(), TypenameLoc,
-                            SS, TargetNameInfo, EllipsisLoc, AttrList,
-                            /*IsInstantiation*/false);
+  NamedDecl *UD = BuildUsingDeclaration(S, AS, UsingLoc, SS,
+                                        TargetNameInfo, AttrList,
+                                        /* IsInstantiation */ false,
+                                        TypenameLoc.isValid(), TypenameLoc);
   if (UD)
     PushOnScopeChains(UD, S, /*AddToContext*/ false);
 
@@ -8669,7 +8654,6 @@ bool Sema::CheckUsingShadowDecl(UsingDec
              diag::err_using_decl_nested_name_specifier_is_current_class)
           << Using->getQualifierLoc().getSourceRange();
         Diag(Orig->getLocation(), diag::note_using_decl_target);
-        Using->setInvalidDecl();
         return true;
       }
 
@@ -8679,7 +8663,6 @@ bool Sema::CheckUsingShadowDecl(UsingDec
         << cast<CXXRecordDecl>(CurContext)
         << Using->getQualifierLoc().getSourceRange();
       Diag(Orig->getLocation(), diag::note_using_decl_target);
-      Using->setInvalidDecl();
       return true;
     }
   }
@@ -8703,7 +8686,7 @@ bool Sema::CheckUsingShadowDecl(UsingDec
     // We can have UsingDecls in our Previous results because we use the same
     // LookupResult for checking whether the UsingDecl itself is a valid
     // redeclaration.
-    if (isa<UsingDecl>(D) || isa<UsingPackDecl>(D))
+    if (isa<UsingDecl>(D))
       continue;
 
     if (IsEquivalentForUsingDecl(Context, D, Target)) {
@@ -8749,7 +8732,6 @@ bool Sema::CheckUsingShadowDecl(UsingDec
 
     Diag(Target->getLocation(), diag::note_using_decl_target);
     Diag(OldDecl->getLocation(), diag::note_using_decl_conflict);
-    Using->setInvalidDecl();
     return true;
   }
 
@@ -8762,7 +8744,6 @@ bool Sema::CheckUsingShadowDecl(UsingDec
     Diag(Using->getLocation(), diag::err_using_decl_conflict);
     Diag(Target->getLocation(), diag::note_using_decl_target);
     Diag(Tag->getLocation(), diag::note_using_decl_conflict);
-    Using->setInvalidDecl();
     return true;
   }
 
@@ -8772,7 +8753,6 @@ bool Sema::CheckUsingShadowDecl(UsingDec
   Diag(Using->getLocation(), diag::err_using_decl_conflict);
   Diag(Target->getLocation(), diag::note_using_decl_target);
   Diag(NonTag->getLocation(), diag::note_using_decl_conflict);
-  Using->setInvalidDecl();
   return true;
 }
 
@@ -8980,19 +8960,23 @@ private:
 ///   the lookup differently for these declarations.
 NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
                                        SourceLocation UsingLoc,
-                                       bool HasTypenameKeyword,
-                                       SourceLocation TypenameLoc,
                                        CXXScopeSpec &SS,
                                        DeclarationNameInfo NameInfo,
-                                       SourceLocation EllipsisLoc,
                                        AttributeList *AttrList,
-                                       bool IsInstantiation) {
+                                       bool IsInstantiation,
+                                       bool HasTypenameKeyword,
+                                       SourceLocation TypenameLoc) {
   assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
   SourceLocation IdentLoc = NameInfo.getLoc();
   assert(IdentLoc.isValid() && "Invalid TargetName location.");
 
   // FIXME: We ignore attributes for now.
 
+  if (SS.isEmpty()) {
+    Diag(IdentLoc, diag::err_using_requires_qualname);
+    return nullptr;
+  }
+
   // For an inheriting constructor declaration, the name of the using
   // declaration is the name of a constructor in this class, not in the
   // base class.
@@ -9058,17 +9042,16 @@ NamedDecl *Sema::BuildUsingDeclaration(S
   DeclContext *LookupContext = computeDeclContext(SS);
   NamedDecl *D;
   NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
-  if (!LookupContext || EllipsisLoc.isValid()) {
+  if (!LookupContext) {
     if (HasTypenameKeyword) {
       // FIXME: not all declaration name kinds are legal here
       D = UnresolvedUsingTypenameDecl::Create(Context, CurContext,
                                               UsingLoc, TypenameLoc,
                                               QualifierLoc,
-                                              IdentLoc, NameInfo.getName(),
-                                              EllipsisLoc);
+                                              IdentLoc, NameInfo.getName());
     } else {
       D = UnresolvedUsingValueDecl::Create(Context, CurContext, UsingLoc, 
-                                           QualifierLoc, NameInfo, EllipsisLoc);
+                                           QualifierLoc, NameInfo);
     }
     D->setAccess(AS);
     CurContext->addDecl(D);
@@ -9228,19 +9211,6 @@ NamedDecl *Sema::BuildUsingDeclaration(S
   return UD;
 }
 
-NamedDecl *Sema::BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
-                                    ArrayRef<NamedDecl *> Expansions) {
-  assert(isa<UnresolvedUsingValueDecl>(InstantiatedFrom) ||
-         isa<UnresolvedUsingTypenameDecl>(InstantiatedFrom) ||
-         isa<UsingPackDecl>(InstantiatedFrom));
-
-  auto *UPD =
-      UsingPackDecl::Create(Context, CurContext, InstantiatedFrom, Expansions);
-  UPD->setAccess(InstantiatedFrom->getAccess());
-  CurContext->addDecl(UPD);
-  return UPD;
-}
-
 /// Additional checks for a using declaration referring to a constructor name.
 bool Sema::CheckInheritingConstructorUsingDecl(UsingDecl *UD) {
   assert(!UD->hasTypename() && "expecting a constructor name");
@@ -9294,7 +9264,7 @@ bool Sema::CheckUsingDeclRedeclaration(S
     // scope?
     if (Qual->isDependent() && !HasTypenameKeyword) {
       for (auto *D : Prev) {
-        if (!isa<TypeDecl>(D) && !isa<UsingDecl>(D) && !isa<UsingPackDecl>(D)) {
+        if (!isa<TypeDecl>(D) && !isa<UsingDecl>(D)) {
           bool OldCouldBeEnumerator =
               isa<UnresolvedUsingValueDecl>(D) || isa<EnumConstantDecl>(D);
           Diag(NameLoc,

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Mon Dec 19 04:09:25 2016
@@ -7462,11 +7462,17 @@ Sema::CheckMicrosoftIfExistsSymbol(Scope
                                    UnqualifiedId &Name) {
   DeclarationNameInfo TargetNameInfo = GetNameFromUnqualifiedId(Name);
 
-  // Check for an unexpanded parameter pack.
-  auto UPPC = IsIfExists ? UPPC_IfExists : UPPC_IfNotExists;
-  if (DiagnoseUnexpandedParameterPack(SS, UPPC) ||
-      DiagnoseUnexpandedParameterPack(TargetNameInfo, UPPC))
+  // Check for unexpanded parameter packs.
+  SmallVector<UnexpandedParameterPack, 4> Unexpanded;
+  collectUnexpandedParameterPacks(SS, Unexpanded);
+  collectUnexpandedParameterPacks(TargetNameInfo, Unexpanded);
+  if (!Unexpanded.empty()) {
+    DiagnoseUnexpandedParameterPacks(KeywordLoc,
+                                     IsIfExists? UPPC_IfExists
+                                               : UPPC_IfNotExists,
+                                     Unexpanded);
     return IER_Error;
+  }
 
   return CheckMicrosoftIfExistsSymbol(S, SS, TargetNameInfo);
 }

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Mon Dec 19 04:09:25 2016
@@ -981,7 +981,7 @@ Sema::CheckOverload(Scope *S, FunctionDe
         Match = *I;
         return Ovl_Match;
       }
-    } else if (isa<UsingDecl>(OldD) || isa<UsingPackDecl>(OldD)) {
+    } else if (isa<UsingDecl>(OldD)) {
       // We can overload with these, which can show up when doing
       // redeclaration checks for UsingDecls.
       assert(Old.getLookupKind() == LookupUsingDeclName);
@@ -11420,12 +11420,6 @@ BuildRecoveryCallExpr(Sema &SemaRef, Sco
 
   assert(!R.empty() && "lookup results empty despite recovery");
 
-  // If recovery created an ambiguity, just bail out.
-  if (R.isAmbiguous()) {
-    R.suppressDiagnostics();
-    return ExprError();
-  }
-
   // Build an implicit member call if appropriate.  Just drop the
   // casts and such from the call, we don't really care.
   ExprResult NewFn = ExprError();

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Mon Dec 19 04:09:25 2016
@@ -2495,76 +2495,35 @@ Decl *TemplateDeclInstantiator::VisitCon
   return nullptr;
 }
 
-template <typename T>
-Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
-    T *D, bool InstantiatingPackElement) {
-  // If this is a pack expansion, expand it now.
-  if (D->isPackExpansion() && !InstantiatingPackElement) {
-    SmallVector<UnexpandedParameterPack, 2> Unexpanded;
-    SemaRef.collectUnexpandedParameterPacks(D->getQualifierLoc(), Unexpanded);
-    SemaRef.collectUnexpandedParameterPacks(D->getNameInfo(), Unexpanded);
-
-    // Determine whether the set of unexpanded parameter packs can and should
-    // be expanded.
-    bool Expand = true;
-    bool RetainExpansion = false;
-    Optional<unsigned> NumExpansions;
-    if (SemaRef.CheckParameterPacksForExpansion(
-          D->getEllipsisLoc(), D->getSourceRange(), Unexpanded, TemplateArgs,
-            Expand, RetainExpansion, NumExpansions))
-      return nullptr;
+Decl * TemplateDeclInstantiator
+    ::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
+  NestedNameSpecifierLoc QualifierLoc
+    = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
+                                          TemplateArgs);
+  if (!QualifierLoc)
+    return nullptr;
 
-    // This declaration cannot appear within a function template signature,
-    // so we can't have a partial argument list for a parameter pack.
-    assert(!RetainExpansion &&
-           "should never need to retain an expansion for UsingPackDecl");
-
-    if (!Expand) {
-      // We cannot fully expand the pack expansion now, so substitute into the
-      // pattern and create a new pack expansion.
-      Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1);
-      return instantiateUnresolvedUsingDecl(D, true);
-    }
-
-    // Within a function, we don't have any normal way to check for conflicts
-    // between shadow declarations from different using declarations in the
-    // same pack expansion, but this is always ill-formed because all expansions
-    // must produce (conflicting) enumerators.
-    //
-    // Sadly we can't just reject this in the template definition because it
-    // could be valid if the pack is empty or has exactly one expansion.
-    if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {
-      SemaRef.Diag(D->getEllipsisLoc(),
-                   diag::err_using_decl_redeclaration_expansion);
-      return nullptr;
-    }
+  CXXScopeSpec SS;
+  SS.Adopt(QualifierLoc);
 
-    // Instantiate the slices of this pack and build a UsingPackDecl.
-    SmallVector<NamedDecl*, 8> Expansions;
-    for (unsigned I = 0; I != *NumExpansions; ++I) {
-      Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
-      Decl *Slice = instantiateUnresolvedUsingDecl(D, true);
-      if (!Slice)
-        return nullptr;
-      // Note that we can still get unresolved using declarations here, if we
-      // had arguments for all packs but the pattern also contained other
-      // template arguments (this only happens during partial substitution, eg
-      // into the body of a generic lambda in a function template).
-      Expansions.push_back(cast<NamedDecl>(Slice));
-    }
-
-    auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
-    if (isDeclWithinFunction(D))
-      SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
-    return NewD;
-  }
+  // Since NameInfo refers to a typename, it cannot be a C++ special name.
+  // Hence, no transformation is required for it.
+  DeclarationNameInfo NameInfo(D->getDeclName(), D->getLocation());
+  NamedDecl *UD =
+    SemaRef.BuildUsingDeclaration(/*Scope*/ nullptr, D->getAccess(),
+                                  D->getUsingLoc(), SS, NameInfo, nullptr,
+                                  /*instantiation*/ true,
+                                  /*typename*/ true, D->getTypenameLoc());
+  if (UD)
+    SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
 
-  UnresolvedUsingTypenameDecl *TD = dyn_cast<UnresolvedUsingTypenameDecl>(D);
-  SourceLocation TypenameLoc = TD ? TD->getTypenameLoc() : SourceLocation();
+  return UD;
+}
 
+Decl * TemplateDeclInstantiator
+    ::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
   NestedNameSpecifierLoc QualifierLoc
-    = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
-                                          TemplateArgs);
+      = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), TemplateArgs);
   if (!QualifierLoc)
     return nullptr;
 
@@ -2574,48 +2533,17 @@ Decl *TemplateDeclInstantiator::instanti
   DeclarationNameInfo NameInfo
     = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
 
-  // Produce a pack expansion only if we're not instantiating a particular
-  // slice of a pack expansion.
-  bool InstantiatingSlice = D->getEllipsisLoc().isValid() &&
-                            SemaRef.ArgumentPackSubstitutionIndex != -1;
-  SourceLocation EllipsisLoc =
-      InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
-
-  NamedDecl *UD = SemaRef.BuildUsingDeclaration(
-      /*Scope*/ nullptr, D->getAccess(), D->getUsingLoc(),
-      /*HasTypename*/ TD, TypenameLoc, SS, NameInfo, EllipsisLoc, nullptr,
-      /*IsInstantiation*/ true);
+  NamedDecl *UD =
+    SemaRef.BuildUsingDeclaration(/*Scope*/ nullptr, D->getAccess(),
+                                  D->getUsingLoc(), SS, NameInfo, nullptr,
+                                  /*instantiation*/ true,
+                                  /*typename*/ false, SourceLocation());
   if (UD)
     SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
 
   return UD;
 }
 
-Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
-    UnresolvedUsingTypenameDecl *D) {
-  return instantiateUnresolvedUsingDecl(D);
-}
-
-Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
-    UnresolvedUsingValueDecl *D) {
-  return instantiateUnresolvedUsingDecl(D);
-}
-
-Decl *TemplateDeclInstantiator::VisitUsingPackDecl(UsingPackDecl *D) {
-  SmallVector<NamedDecl*, 8> Expansions;
-  for (auto *UD : D->expansions()) {
-    if (auto *NewUD =
-            SemaRef.FindInstantiatedDecl(D->getLocation(), UD, TemplateArgs))
-      Expansions.push_back(cast<NamedDecl>(NewUD));
-    else
-      return nullptr;
-  }
-
-  auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
-  if (isDeclWithinFunction(D))
-    SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
-  return NewD;
-}
 
 Decl *TemplateDeclInstantiator::VisitClassScopeFunctionSpecializationDecl(
                                      ClassScopeFunctionSpecializationDecl *Decl) {
@@ -4585,36 +4513,22 @@ static bool isInstantiationOf(UsingShado
                             Pattern);
 }
 
-static bool isInstantiationOf(UsingDecl *Pattern, UsingDecl *Instance,
+static bool isInstantiationOf(UsingDecl *Pattern,
+                              UsingDecl *Instance,
                               ASTContext &C) {
   return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
 }
 
-template<typename T>
-static bool isInstantiationOfUnresolvedUsingDecl(T *Pattern, Decl *Other,
-                                                 ASTContext &Ctx) {
-  // An unresolved using declaration can instantiate to an unresolved using
-  // declaration, or to a using declaration or a using declaration pack.
-  //
-  // Multiple declarations can claim to be instantiated from an unresolved
-  // using declaration if it's a pack expansion. We want the UsingPackDecl
-  // in that case, not the individual UsingDecls within the pack.
-  bool OtherIsPackExpansion;
-  NamedDecl *OtherFrom;
-  if (auto *OtherUUD = dyn_cast<T>(Other)) {
-    OtherIsPackExpansion = OtherUUD->isPackExpansion();
-    OtherFrom = Ctx.getInstantiatedFromUsingDecl(OtherUUD);
-  } else if (auto *OtherUPD = dyn_cast<UsingPackDecl>(Other)) {
-    OtherIsPackExpansion = true;
-    OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
-  } else if (auto *OtherUD = dyn_cast<UsingDecl>(Other)) {
-    OtherIsPackExpansion = false;
-    OtherFrom = Ctx.getInstantiatedFromUsingDecl(OtherUD);
-  } else {
-    return false;
-  }
-  return Pattern->isPackExpansion() == OtherIsPackExpansion &&
-         declaresSameEntity(OtherFrom, Pattern);
+static bool isInstantiationOf(UnresolvedUsingValueDecl *Pattern,
+                              NamedDecl *Instance,
+                              ASTContext &C) {
+  return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
+}
+
+static bool isInstantiationOf(UnresolvedUsingTypenameDecl *Pattern,
+                              NamedDecl *Instance,
+                              ASTContext &C) {
+  return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
 }
 
 static bool isInstantiationOfStaticDataMember(VarDecl *Pattern,
@@ -4635,14 +4549,21 @@ static bool isInstantiationOfStaticDataM
 // Other is the prospective instantiation
 // D is the prospective pattern
 static bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) {
-  if (auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D))
-    return isInstantiationOfUnresolvedUsingDecl(UUD, Other, Ctx);
+  if (D->getKind() != Other->getKind()) {
+    if (auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
+      if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
+        return isInstantiationOf(UUD, UD, Ctx);
+      }
+    }
 
-  if (auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D))
-    return isInstantiationOfUnresolvedUsingDecl(UUD, Other, Ctx);
+    if (auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
+      if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
+        return isInstantiationOf(UUD, UD, Ctx);
+      }
+    }
 
-  if (D->getKind() != Other->getKind())
     return false;
+  }
 
   if (auto *Record = dyn_cast<CXXRecordDecl>(Other))
     return isInstantiationOf(cast<CXXRecordDecl>(D), Record);
@@ -4679,6 +4600,12 @@ static bool isInstantiationOf(ASTContext
   if (auto *Using = dyn_cast<UsingDecl>(Other))
     return isInstantiationOf(cast<UsingDecl>(D), Using, Ctx);
 
+  if (auto *Using = dyn_cast<UnresolvedUsingValueDecl>(Other))
+    return isInstantiationOf(cast<UnresolvedUsingValueDecl>(D), Using, Ctx);
+
+  if (auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(Other))
+    return isInstantiationOf(cast<UnresolvedUsingTypenameDecl>(D), Using, Ctx);
+
   if (auto *Shadow = dyn_cast<UsingShadowDecl>(Other))
     return isInstantiationOf(cast<UsingShadowDecl>(D), Shadow, Ctx);
 
@@ -4919,8 +4846,6 @@ NamedDecl *Sema::FindInstantiatedDecl(So
     }
 
     NamedDecl *Result = nullptr;
-    // FIXME: If the name is a dependent name, this lookup won't necessarily
-    // find it. Does that ever matter?
     if (D->getDeclName()) {
       DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName());
       Result = findInstantiationOf(Context, D, Found.begin(), Found.end());

Modified: cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp Mon Dec 19 04:09:25 2016
@@ -390,18 +390,21 @@ void Sema::collectUnexpandedParameterPac
 void Sema::collectUnexpandedParameterPacks(TypeLoc TL,
                    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
   CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL);  
-}
+}  
 
-void Sema::collectUnexpandedParameterPacks(
-    NestedNameSpecifierLoc NNS,
-    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
+void Sema::collectUnexpandedParameterPacks(CXXScopeSpec &SS,
+                                           SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
+  NestedNameSpecifier *Qualifier = SS.getScopeRep();
+  if (!Qualifier)
+    return;
+  
+  NestedNameSpecifierLoc QualifierLoc(Qualifier, SS.location_data());
   CollectUnexpandedParameterPacksVisitor(Unexpanded)
-      .TraverseNestedNameSpecifierLoc(NNS);
+    .TraverseNestedNameSpecifierLoc(QualifierLoc);
 }
 
-void Sema::collectUnexpandedParameterPacks(
-    const DeclarationNameInfo &NameInfo,
-    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
+void Sema::collectUnexpandedParameterPacks(const DeclarationNameInfo &NameInfo,
+                         SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
   CollectUnexpandedParameterPacksVisitor(Unexpanded)
     .TraverseDeclarationNameInfo(NameInfo);
 }

Modified: cfe/trunk/lib/Sema/TreeTransform.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/TreeTransform.h (original)
+++ cfe/trunk/lib/Sema/TreeTransform.h Mon Dec 19 04:09:25 2016
@@ -457,10 +457,6 @@ public:
     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
   }
 
-  /// Transform the set of declarations in an OverloadExpr.
-  bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
-                                  LookupResult &R);
-
   /// \brief Transform the given nested-name-specifier with source-location
   /// information.
   ///
@@ -825,7 +821,7 @@ public:
 
   /// \brief Rebuild an unresolved typename type, given the decl that
   /// the UnresolvedUsingTypenameDecl was transformed to.
-  QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
+  QualType RebuildUnresolvedUsingType(Decl *D);
 
   /// \brief Build a new typedef type.
   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
@@ -5165,7 +5161,7 @@ TreeTransform<Derived>::TransformUnresol
 
   QualType Result = TL.getType();
   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
-    Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
+    Result = getDerived().RebuildUnresolvedUsingType(D);
     if (Result.isNull())
       return QualType();
   }
@@ -9798,71 +9794,44 @@ TreeTransform<Derived>::TransformCXXPseu
                                                      Destroyed);
 }
 
-template <typename Derived>
-bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
-                                                        bool RequiresADL,
-                                                        LookupResult &R) {
+template<typename Derived>
+ExprResult
+TreeTransform<Derived>::TransformUnresolvedLookupExpr(
+                                                  UnresolvedLookupExpr *Old) {
+  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
+                 Sema::LookupOrdinaryName);
+
   // Transform all the decls.
-  bool AllEmptyPacks = true;
-  for (auto *OldD : Old->decls()) {
-    Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
+  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
+         E = Old->decls_end(); I != E; ++I) {
+    NamedDecl *InstD = static_cast<NamedDecl*>(
+                                 getDerived().TransformDecl(Old->getNameLoc(),
+                                                            *I));
     if (!InstD) {
       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
       // This can happen because of dependent hiding.
-      if (isa<UsingShadowDecl>(OldD))
+      if (isa<UsingShadowDecl>(*I))
         continue;
       else {
         R.clear();
-        return true;
+        return ExprError();
       }
     }
 
-    // Expand using pack declarations.
-    ArrayRef<NamedDecl*> Decls = cast<NamedDecl>(InstD);
-    if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
-      Decls = UPD->expansions();
-
     // Expand using declarations.
-    for (auto *D : Decls) {
-      if (auto *UD = dyn_cast<UsingDecl>(D)) {
-        for (auto *SD : UD->shadows())
-          R.addDecl(SD);
-      } else {
-        R.addDecl(D);
-      }
+    if (isa<UsingDecl>(InstD)) {
+      UsingDecl *UD = cast<UsingDecl>(InstD);
+      for (auto *I : UD->shadows())
+        R.addDecl(I);
+      continue;
     }
 
-    AllEmptyPacks &= Decls.empty();
-  };
-
-  // C++ [temp.res]/8.4.2:
-  //   The program is ill-formed, no diagnostic required, if [...] lookup for
-  //   a name in the template definition found a using-declaration, but the
-  //   lookup in the corresponding scope in the instantiation odoes not find
-  //   any declarations because the using-declaration was a pack expansion and
-  //   the corresponding pack is empty
-  if (AllEmptyPacks && !RequiresADL) {
-    getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
-        << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
-    return true;
+    R.addDecl(InstD);
   }
 
   // Resolve a kind, but don't do any further analysis.  If it's
   // ambiguous, the callee needs to deal with it.
   R.resolveKind();
-  return false;
-}
-
-template<typename Derived>
-ExprResult
-TreeTransform<Derived>::TransformUnresolvedLookupExpr(
-                                                  UnresolvedLookupExpr *Old) {
-  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
-                 Sema::LookupOrdinaryName);
-
-  // Transform the declaration set.
-  if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
-    return ExprError();
 
   // Rebuild the nested-name qualifier, if present.
   CXXScopeSpec SS;
@@ -10730,9 +10699,35 @@ TreeTransform<Derived>::TransformUnresol
   LookupResult R(SemaRef, Old->getMemberNameInfo(),
                  Sema::LookupOrdinaryName);
 
-  // Transform the declaration set.
-  if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
-    return ExprError();
+  // Transform all the decls.
+  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
+         E = Old->decls_end(); I != E; ++I) {
+    NamedDecl *InstD = static_cast<NamedDecl*>(
+                                getDerived().TransformDecl(Old->getMemberLoc(),
+                                                           *I));
+    if (!InstD) {
+      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
+      // This can happen because of dependent hiding.
+      if (isa<UsingShadowDecl>(*I))
+        continue;
+      else {
+        R.clear();
+        return ExprError();
+      }
+    }
+
+    // Expand using declarations.
+    if (isa<UsingDecl>(InstD)) {
+      UsingDecl *UD = cast<UsingDecl>(InstD);
+      for (auto *I : UD->shadows())
+        R.addDecl(I);
+      continue;
+    }
+
+    R.addDecl(InstD);
+  }
+
+  R.resolveKind();
 
   // Determine the naming class.
   if (Old->getNamingClass()) {
@@ -11847,48 +11842,21 @@ QualType TreeTransform<Derived>::Rebuild
 }
 
 template<typename Derived>
-QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
-                                                            Decl *D) {
+QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
   assert(D && "no decl found");
   if (D->isInvalidDecl()) return QualType();
 
   // FIXME: Doesn't account for ObjCInterfaceDecl!
   TypeDecl *Ty;
-  if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
-    // A valid resolved using typename pack expansion decl can have multiple
-    // UsingDecls, but they must each have exactly one type, and it must be
-    // the same type in every case. But we must have at least one expansion!
-    if (UPD->expansions().empty()) {
-      getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
-          << UPD->isCXXClassMember() << UPD;
-      return QualType();
-    }
-
-    // We might still have some unresolved types. Try to pick a resolved type
-    // if we can. The final instantiation will check that the remaining
-    // unresolved types instantiate to the type we pick.
-    QualType FallbackT;
-    QualType T;
-    for (auto *E : UPD->expansions()) {
-      QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
-      if (ThisT.isNull())
-        continue;
-      else if (ThisT->getAs<UnresolvedUsingType>())
-        FallbackT = ThisT;
-      else if (T.isNull())
-        T = ThisT;
-      else
-        assert(getSema().Context.hasSameType(ThisT, T) &&
-               "mismatched resolved types in using pack expansion");
-    }
-    return T.isNull() ? FallbackT : T;
-  } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
+  if (isa<UsingDecl>(D)) {
+    UsingDecl *Using = cast<UsingDecl>(D);
     assert(Using->hasTypename() &&
            "UnresolvedUsingTypenameDecl transformed to non-typename using");
 
     // A valid resolved using typename decl points to exactly one type decl.
     assert(++Using->shadow_begin() == Using->shadow_end());
     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
+
   } else {
     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
            "UnresolvedUsingTypenameDecl transformed to non-using decl");

Modified: cfe/trunk/lib/Serialization/ASTCommon.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTCommon.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTCommon.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTCommon.cpp Mon Dec 19 04:09:25 2016
@@ -285,7 +285,6 @@ bool serialization::isRedeclarableDeclKi
   case Decl::NonTypeTemplateParm:
   case Decl::TemplateTemplateParm:
   case Decl::Using:
-  case Decl::UsingPack:
   case Decl::ObjCMethod:
   case Decl::ObjCCategory:
   case Decl::ObjCCategoryImpl:

Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Mon Dec 19 04:09:25 2016
@@ -322,7 +322,6 @@ namespace clang {
     void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
     void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
     void VisitUsingDecl(UsingDecl *D);
-    void VisitUsingPackDecl(UsingPackDecl *D);
     void VisitUsingShadowDecl(UsingShadowDecl *D);
     void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D);
     void VisitLinkageSpecDecl(LinkageSpecDecl *D);
@@ -1420,15 +1419,6 @@ void ASTDeclReader::VisitUsingDecl(Using
   mergeMergeable(D);
 }
 
-void ASTDeclReader::VisitUsingPackDecl(UsingPackDecl *D) {
-  VisitNamedDecl(D);
-  D->InstantiatedFrom = ReadDeclAs<NamedDecl>();
-  NamedDecl **Expansions = D->getTrailingObjects<NamedDecl*>();
-  for (unsigned I = 0; I != D->NumExpansions; ++I)
-    Expansions[I] = ReadDeclAs<NamedDecl>();
-  mergeMergeable(D);
-}
-
 void ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) {
   RedeclarableResult Redecl = VisitRedeclarable(D);
   VisitNamedDecl(D);
@@ -1462,7 +1452,6 @@ void ASTDeclReader::VisitUnresolvedUsing
   D->setUsingLoc(ReadSourceLocation());
   D->QualifierLoc = Record.ReadNestedNameSpecifierLoc(Idx);
   ReadDeclarationNameLoc(D->DNLoc, D->getDeclName());
-  D->EllipsisLoc = ReadSourceLocation();
   mergeMergeable(D);
 }
 
@@ -1471,7 +1460,6 @@ void ASTDeclReader::VisitUnresolvedUsing
   VisitTypeDecl(D);
   D->TypenameLocation = ReadSourceLocation();
   D->QualifierLoc = Record.ReadNestedNameSpecifierLoc(Idx);
-  D->EllipsisLoc = ReadSourceLocation();
   mergeMergeable(D);
 }
 
@@ -3309,9 +3297,6 @@ Decl *ASTReader::ReadDeclRecord(DeclID I
   case DECL_USING:
     D = UsingDecl::CreateDeserialized(Context, ID);
     break;
-  case DECL_USING_PACK:
-    D = UsingPackDecl::CreateDeserialized(Context, ID, Record[Idx++]);
-    break;
   case DECL_USING_SHADOW:
     D = UsingShadowDecl::CreateDeserialized(Context, ID);
     break;

Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Mon Dec 19 04:09:25 2016
@@ -107,7 +107,6 @@ namespace clang {
     void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
     void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
     void VisitUsingDecl(UsingDecl *D);
-    void VisitUsingPackDecl(UsingPackDecl *D);
     void VisitUsingShadowDecl(UsingShadowDecl *D);
     void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D);
     void VisitLinkageSpecDecl(LinkageSpecDecl *D);
@@ -1143,15 +1142,6 @@ void ASTDeclWriter::VisitUsingDecl(Using
   Code = serialization::DECL_USING;
 }
 
-void ASTDeclWriter::VisitUsingPackDecl(UsingPackDecl *D) {
-  Record.push_back(D->NumExpansions);
-  VisitNamedDecl(D);
-  Record.AddDeclRef(D->getInstantiatedFromUsingDecl());
-  for (auto *E : D->expansions())
-    Record.AddDeclRef(E);
-  Code = serialization::DECL_USING_PACK;
-}
-
 void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) {
   VisitRedeclarable(D);
   VisitNamedDecl(D);
@@ -1185,7 +1175,6 @@ void ASTDeclWriter::VisitUnresolvedUsing
   Record.AddSourceLocation(D->getUsingLoc());
   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
   Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
-  Record.AddSourceLocation(D->getEllipsisLoc());
   Code = serialization::DECL_UNRESOLVED_USING_VALUE;
 }
 
@@ -1194,7 +1183,6 @@ void ASTDeclWriter::VisitUnresolvedUsing
   VisitTypeDecl(D);
   Record.AddSourceLocation(D->getTypenameLoc());
   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
-  Record.AddSourceLocation(D->getEllipsisLoc());
   Code = serialization::DECL_UNRESOLVED_USING_TYPENAME;
 }
 

Removed: cfe/trunk/test/PCH/cxx1z-using-declaration.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/cxx1z-using-declaration.cpp?rev=290091&view=auto
==============================================================================
--- cfe/trunk/test/PCH/cxx1z-using-declaration.cpp (original)
+++ cfe/trunk/test/PCH/cxx1z-using-declaration.cpp (removed)
@@ -1,35 +0,0 @@
-// No PCH:
-// RUN: %clang_cc1 -pedantic -std=c++1z -include %s -verify %s
-//
-// With PCH:
-// RUN: %clang_cc1 -pedantic -std=c++1z -emit-pch %s -o %t
-// RUN: %clang_cc1 -pedantic -std=c++1z -include-pch %t -verify %s
-
-#ifndef HEADER
-#define HEADER
-
-template<typename ...T> struct A : T... {
-  using T::f ...;
-  template<typename ...U> void g(U ...u) { f(u...); }
-};
-
-struct X { void f(); };
-struct Y { void f(int); };
-struct Z { void f(int, int); };
-
-inline A<X, Y, Z> a;
-
-#else
-
-void test() {
-  a.g();
-  a.g(0);
-  a.g(0, 0);
-  // expected-error at 13 {{no match}}
-  // expected-note at 16 {{candidate}}
-  // expected-note at 17 {{candidate}}
-  // expected-note at 18 {{candidate}}
-  a.g(0, 0, 0); // expected-note {{instantiation of}}
-}
-
-#endif

Modified: cfe/trunk/test/Parser/cxx1z-using-declaration.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx1z-using-declaration.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/test/Parser/cxx1z-using-declaration.cpp (original)
+++ cfe/trunk/test/Parser/cxx1z-using-declaration.cpp Mon Dec 19 04:09:25 2016
@@ -10,10 +10,10 @@ namespace B {
 }
 
 struct X {
-  int x1, x2, y, z; // expected-note 2{{conflicting}}
+  int x1, x2, y, z; // expected-note {{conflicting}}
 };
 struct Y {
-  int x1, x2, y, z; // expected-note 2{{target}}
+  int x1, x2, y, z; // expected-note {{target}}
 };
 struct Z : X, Y {
   using X::x1,
@@ -28,8 +28,3 @@ int X::*px1 = &Z::x1;
 int X::*px2 = &Z::x2;
 int Y::*py = &Z::y;
 int X::*pz = &Z::z;
-
-template<typename ...T> struct Q : T... {
-  using T::z...; // expected-error {{conflicts}}
-};
-Q<X,Y> q; // expected-note {{instantiation of}}

Removed: cfe/trunk/test/SemaTemplate/cxx1z-using-declaration.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/cxx1z-using-declaration.cpp?rev=290091&view=auto
==============================================================================
--- cfe/trunk/test/SemaTemplate/cxx1z-using-declaration.cpp (original)
+++ cfe/trunk/test/SemaTemplate/cxx1z-using-declaration.cpp (removed)
@@ -1,230 +0,0 @@
-// RUN: %clang_cc1 -std=c++1z -verify %s
-
-// Test that we cope with failure to expand a pack.
-template<typename ...T> struct Unexpanded : T... {
-  using T::f; // expected-error {{unexpanded}}
-  using typename T::type; // expected-error {{unexpanded}}
-  template<typename ...U> void g(U ...u) { f(u...); } // expected-error {{undeclared identifier 'f'}}
-  void h() {
-    Unexpanded<type...> *p; // expected-error {{undeclared identifier 'type'}}
-  }
-};
-void test_Unexpanded() {
-  struct A { void f(); }; // expected-note {{must qualify}}
-  struct B { void f(int); }; // expected-note {{must qualify}}
-  Unexpanded<A, B>().g(0); // expected-note {{instantiation of}}
-}
-
-// Test using non-type members from pack of base classes.
-template<typename ...T> struct A : T... { // expected-note 2{{candidate}}
-  using T::T ...; // expected-note 6{{inherited here}}
-  using T::operator() ...;
-  using T::operator T* ...;
-  using T::h ...;
-
-  void f(int n) { h(n); } // expected-error {{ambiguous}}
-  void f(int n, int m) { h(n, m); } // expected-error {{member using declaration 'h' instantiates to an empty pack}}
-  void g(int n) { (*this)(n); } // expected-error {{ambiguous}}
-  void g(int n, int m) { (*this)(n, m); } // expected-error {{does not provide a call operator}}
-};
-
-namespace test_A {
-  struct X { // expected-note 2{{candidate}}
-    X();
-    X(int); // expected-note {{candidate}}
-    void operator()(int); // expected-note 2{{candidate}}
-    operator X *();
-    void h(int); // expected-note {{candidate}}
-  };
-  struct Y {
-    Y();
-    Y(int, int);
-    void operator()(int, int);
-    operator Y *();
-    void h(int, int); // expected-note {{not viable}}
-  };
-  struct Z { // expected-note 2{{candidate}}
-    Z();
-    Z(int); // expected-note {{candidate}}
-    void operator()(int); // expected-note 2{{candidate}}
-    operator Z *();
-    void h(int); // expected-note {{candidate}}
-  };
-
-  void f() {
-    A<> a;
-    a.f(0, 0); // expected-note {{instantiation of}}
-    a.g(0, 0); // expected-note {{instantiation of}}
-
-    A<X, Y> axy(0);
-    A<X, Y>(0, 0);
-    axy.f(0);
-    axy.f(0, 0);
-    axy.g(0);
-    axy.g(0, 0);
-    axy(0);
-    axy(0, 0);
-
-    A<X, Y, Z>(0); // expected-error {{ambiguous}}
-    A<X, Y, Z> axyz(0, 0);
-    axyz.f(0); // expected-note {{instantiation of}}
-    axyz.f(0, 0);
-    axyz.g(0); // expected-note {{instantiation of}}
-    axyz.g(0, 0);
-    axyz(0); // expected-error {{ambiguous}}
-    axyz(0, 0);
-
-    X *x;
-    x = a; // expected-error {{incompatible}}
-    x = axy;
-    x = axyz;
-    x = a.operator X*(); // expected-error {{no member}}
-    x = axy.operator X*();
-    x = axyz.operator X*();
-
-    Z *z;
-    z = axyz;
-    z = axyz.operator Z*();
-  }
-}
-
-// Test using pack of non-type members from single base class.
-template<typename X, typename Y, typename ...T> struct B : X, Y {
-  using X::operator T* ...;
-};
-
-namespace test_B {
-  struct X { operator int*(); operator float*(); operator char*(); }; // expected-note {{candidate}}
-  struct Y { operator int*(); operator float*(); operator char*(); }; // expected-note {{candidate}}
-  B<X, Y, int, float> bif;
-  int *pi = bif;
-  float *pf = bif;
-  char *pc = bif; // expected-error {{ambiguous}}
-}
-
-// Test using type member from pack of base classes.
-template<typename ...T> struct C : T... {
-  using typename T::type ...; // expected-error {{target of using declaration conflicts}}
-  void f() { type value; } // expected-error {{member using declaration 'type' instantiates to an empty pack}}
-};
-
-namespace test_C {
-  struct X { typedef int type; };
-  struct Y { typedef int type; }; // expected-note {{conflicting}}
-  struct Z { typedef float type; }; // expected-note {{target}}
-
-  void f() {
-    C<> c;
-    c.f(); // expected-note {{instantiation of}}
-
-    C<X, Y> cxy;
-    cxy.f();
-
-    C<X, Y, Z> cxyz; // expected-note {{instantiation of}}
-    cxyz.f();
-  }
-}
-
-// Test using pack of non-types at block scope.
-template<typename ...T> int fn1() {
-  using T::e ...; // expected-error 2{{class member}} expected-note 2{{instead}}
-  // expected-error at -1 2{{produces multiple values}}
-  return e; // expected-error {{using declaration 'e' instantiates to an empty pack}}
-}
-
-namespace test_fn1 {
-  struct X { static int e; };
-  struct Y { typedef int e; };
-  inline namespace P { enum E { e }; }
-  inline namespace Q { enum F { e }; }
-  void f() {
-    fn1<>(); // expected-note {{instantiation of}}
-    fn1<X>(); // expected-note {{instantiation of}}
-    fn1<Y>(); // expected-note {{instantiation of}}
-    fn1<E>();
-    fn1<E, F>(); // expected-note {{instantiation of}}
-    fn1<E, X>(); // expected-note {{instantiation of}}
-  }
-}
-
-// Test using pack of types at block scope.
-template<typename ...T> void fn2() {
-  // This cannot ever be valid: in order for T::type to be a type, T must be a
-  // class, and a class member cannot be named by a block-scope using declaration.
-  using typename T::type ...; // expected-error {{class member}}
-  type x; // expected-error {{unknown type name 'type'}}
-}
-
-// Test partial substitution into class-scope pack.
-template<typename ...T> auto lambda1() {
-  return [](auto x) {
-    struct A : T::template X<decltype(x)>... { // expected-note 1+{{instantiation of}}
-      using T::template X<decltype(x)>::f ...;
-      using typename T::template X<decltype(x)>::type ...;
-      void g(int n) { f(n); } // expected-error {{empty pack}} expected-error {{expected 2, have 1}} expected-error {{ambiguous}}
-      void h() { type value; } // expected-error {{empty pack}}
-    };
-    return A();
-  };
-}
-
-namespace test_lambda1 {
-  struct A {
-    template<typename> struct X {
-      void f(int); // expected-note {{candidate}}
-      using type = int;
-    };
-  };
-  struct B {
-    template<typename> struct X {
-      void f(int, int); // expected-note {{declared here}} expected-note {{not viable}}
-      using type = int;
-    };
-  };
-  struct C {
-    template<typename> struct X {
-      void f(int); // expected-note {{candidate}}
-      void f(int, int); // expected-note {{not viable}}
-      using type = int;
-    };
-  };
-
-  void f() {
-    lambda1<>() // expected-note 2{{instantiation of}}
-      (0)
-      // FIXME: This is poor error recovery
-      .g(0); // expected-error {{no member named 'g'}}
-    lambda1<A>()
-      (0)
-      .g(0);
-    lambda1<B>()
-      (0) // expected-note {{instantiation of}}
-      .g(0);
-    lambda1<A, B, C>()
-      (0) // expected-note {{instantiation of}}
-      .g(0);
-  }
-}
-
-namespace p0195r2_example {
-  template<typename ...Ts>
-  struct Overloader : Ts... {
-    using Ts::operator() ...;
-  };
-
-  template<typename ...Ts>
-  constexpr auto make_overloader(Ts &&...ts) {
-    return Overloader<Ts...>{static_cast<Ts&&>(ts)...};
-  }
-
-  void test() {
-    auto o = make_overloader(
-      [&](int &r) -> int & { return r; }, // expected-note {{candidate function}}
-      [&](float &r) -> float & { return r; } // expected-note {{candidate function}}
-    );
-    int a; float f; double d;
-    int &ra = o(a);
-    float &rf = o(f);
-    double &rd = o(d); // expected-error {{no matching function}}
-  }
-}

Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=290092&r1=290091&r2=290092&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Mon Dec 19 04:09:25 2016
@@ -5733,7 +5733,6 @@ CXCursor clang_getCursorDefinition(CXCur
   case Decl::BuiltinTemplate:
   case Decl::PragmaComment:
   case Decl::PragmaDetectMismatch:
-  case Decl::UsingPack:
     return C;
 
   // Declaration kinds that don't make any sense here, but are




More information about the cfe-commits mailing list