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