r293473 - Revert r293455, which breaks v8 with a spurious error. Testcase added.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 30 12:50:49 PST 2017
Thanks for the revert; fixed and re-committed as r293544.
On 30 January 2017 at 02:44, Sam McCall via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: sammccall
> Date: Mon Jan 30 04:44:11 2017
> New Revision: 293473
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293473&view=rev
> Log:
> Revert r293455, which breaks v8 with a spurious error. Testcase added.
>
> Summary: Revert r293455, which breaks v8 with a spurious error. Testcase
> added.
>
> Reviewers: klimek
>
> Subscribers: cfe-commits, rsmith
>
> Differential Revision: https://reviews.llvm.org/D29271
>
> Modified:
> cfe/trunk/include/clang/AST/DeclTemplate.h
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaTemplate.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> cfe/trunk/lib/Sema/TreeTransform.h
> cfe/trunk/test/Parser/cxx1z-class-template-argument-deduction.cpp
> cfe/trunk/test/SemaCXX/cxx0x-class.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/AST/DeclTemplate.h?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
> +++ cfe/trunk/include/clang/AST/DeclTemplate.h Mon Jan 30 04:44:11 2017
> @@ -2946,16 +2946,6 @@ inline NamedDecl *getAsNamedDecl(Templat
> return P.get<TemplateTemplateParmDecl*>();
> }
>
> -inline TemplateDecl *getAsTypeTemplateDecl(Decl *D) {
> - auto *TD = dyn_cast<TemplateDecl>(D);
> - return TD && (isa<ClassTemplateDecl>(TD) ||
> - isa<ClassTemplatePartialSpecializationDecl>(TD) ||
> - isa<TypeAliasTemplateDecl>(TD) ||
> - isa<TemplateTemplateParmDecl>(TD))
> - ? TD
> - : nullptr;
> -}
> -
> } /* end of namespace clang */
>
> #endif
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
> DiagnosticSemaKinds.td?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Jan 30
> 04:44:11 2017
> @@ -1884,11 +1884,6 @@ def err_auto_not_allowed : Error<
> "|in conversion function type|here|in lambda parameter"
> "|in type allocated by 'new'|in K&R-style function parameter"
> "|in template parameter|in friend declaration}1">;
> -def err_dependent_deduced_tst : Error<
> - "typename specifier refers to "
> - "%select{class template|function template|variable template|alias
> template|"
> - "template template parameter|template}0 member in %1; "
> - "argument deduction not allowed here">;
> def err_auto_not_allowed_var_inst : Error<
> "'auto' variable template instantiation is not allowed">;
> def err_auto_var_requires_init : Error<
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Sema/Sema.h?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Mon Jan 30 04:44:11 2017
> @@ -7359,8 +7359,7 @@ public:
>
> TypeSourceInfo *SubstType(TypeSourceInfo *T,
> const MultiLevelTemplateArgumentList
> &TemplateArgs,
> - SourceLocation Loc, DeclarationName Entity,
> - bool AllowDeducedTST = false);
> + SourceLocation Loc, DeclarationName Entity);
>
> QualType SubstType(QualType T,
> const MultiLevelTemplateArgumentList &TemplateArgs,
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaDecl.cpp?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Jan 30 04:44:11 2017
> @@ -60,6 +60,11 @@ Sema::DeclGroupPtrTy Sema::ConvertDeclTo
> return DeclGroupPtrTy::make(DeclGroupRef(Ptr));
> }
>
> +static bool isTypeTemplate(NamedDecl *ND) {
> + return isa<ClassTemplateDecl>(ND) || isa<TypeAliasTemplateDecl>(ND) ||
> + isa<TemplateTemplateParmDecl>(ND);
> +}
> +
> namespace {
>
> class TypeNameValidatorCCC : public CorrectionCandidateCallback {
> @@ -76,7 +81,7 @@ class TypeNameValidatorCCC : public Corr
> bool ValidateCandidate(const TypoCorrection &candidate) override {
> if (NamedDecl *ND = candidate.getCorrectionDecl()) {
> bool IsType = isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
> - bool AllowedTemplate = AllowTemplates && getAsTypeTemplateDecl(ND);
> + bool AllowedTemplate = AllowTemplates && isTypeTemplate(ND);
> return (IsType || AllowedTemplate) &&
> (AllowInvalidDecl || !ND->isInvalidDecl());
> }
> @@ -400,7 +405,7 @@ ParsedType Sema::getTypeName(const Ident
> for (LookupResult::iterator Res = Result.begin(), ResEnd =
> Result.end();
> Res != ResEnd; ++Res) {
> if (isa<TypeDecl>(*Res) || isa<ObjCInterfaceDecl>(*Res) ||
> - (AllowDeducedTemplate && getAsTypeTemplateDecl(*Res))) {
> + (AllowDeducedTemplate && isTypeTemplate(*Res))) {
> if (!IIDecl ||
> (*Res)->getLocation().getRawEncoding() <
> IIDecl->getLocation().getRawEncoding())
> @@ -453,10 +458,9 @@ ParsedType Sema::getTypeName(const Ident
> (void)DiagnoseUseOfDecl(IDecl, NameLoc);
> if (!HasTrailingDot)
> T = Context.getObjCInterfaceType(IDecl);
> - } else if (AllowDeducedTemplate) {
> - if (auto *TD = getAsTypeTemplateDecl(IIDecl))
> - T = Context.getDeducedTemplateSpecializationType(TemplateName(TD),
> - QualType(), false);
> + } else if (AllowDeducedTemplate && isTypeTemplate(IIDecl)) {
> + T = Context.getDeducedTemplateSpecializationType(
> + TemplateName(cast<TemplateDecl>(IIDecl)), QualType(), false);
> }
>
> if (T.isNull()) {
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaTemplate.cpp?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon Jan 30 04:44:11 2017
> @@ -8792,18 +8792,8 @@ Sema::CheckTypenameType(ElaboratedTypeKe
> Context.getTypeDeclType(Type));
> }
>
> - // C++ [dcl.type.simple]p2:
> - // A type-specifier of the form
> - // typename[opt] nested-name-specifier[opt] template-name
> - // is a placeholder for a deduced class type [...].
> - if (getLangOpts().CPlusPlus1z) {
> - if (auto *TD = getAsTypeTemplateDecl(Result.getFoundDecl())) {
> - return Context.getElaboratedType(
> - Keyword, QualifierLoc.getNestedNameSpecifier(),
> - Context.getDeducedTemplateSpecializati
> onType(TemplateName(TD),
> - QualType(),
> false));
> - }
> - }
> + // FIXME: Form a deduced template specialization type if we get a
> template
> + // declaration here.
>
> DiagID = diag::err_typename_nested_not_type;
> Referenced = Result.getFoundDecl();
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaTemplateInstantiate.cpp?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Mon Jan 30 04:44:11
> 2017
> @@ -1490,16 +1490,12 @@ TemplateInstantiator::TransformSubstTemp
> /// a cast expression) or that the entity has no name (e.g., an
> /// unnamed function parameter).
> ///
> -/// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
> -/// acceptable as the top level type of the result.
> -///
> /// \returns If the instantiation succeeds, the instantiated
> /// type. Otherwise, produces diagnostics and returns a NULL type.
> TypeSourceInfo *Sema::SubstType(TypeSourceInfo *T,
> const MultiLevelTemplateArgumentList
> &Args,
> SourceLocation Loc,
> - DeclarationName Entity,
> - bool AllowDeducedTST) {
> + DeclarationName Entity) {
> assert(!ActiveTemplateInstantiations.empty() &&
> "Cannot perform an instantiation without some context on the "
> "instantiation stack");
> @@ -1509,8 +1505,7 @@ TypeSourceInfo *Sema::SubstType(TypeSour
> return T;
>
> TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
> - return AllowDeducedTST ? Instantiator.TransformTypeWithDeducedTST(T)
> - : Instantiator.TransformType(T);
> + return Instantiator.TransformType(T);
> }
>
> TypeSourceInfo *Sema::SubstType(TypeLoc TL,
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaTemplateInstantiateDecl.cpp?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Mon Jan 30
> 04:44:11 2017
> @@ -657,9 +657,10 @@ Decl *TemplateDeclInstantiator::VisitVar
> ArrayRef<BindingDecl*>
> *Bindings) {
>
> // Do substitution on the type of the declaration
> - TypeSourceInfo *DI = SemaRef.SubstType(
> - D->getTypeSourceInfo(), TemplateArgs, D->getTypeSpecStartLoc(),
> - D->getDeclName(), /*AllowDeducedTST*/true);
> + TypeSourceInfo *DI = SemaRef.SubstType(D->getTypeSourceInfo(),
> + TemplateArgs,
> + D->getTypeSpecStartLoc(),
> + D->getDeclName());
> if (!DI)
> return nullptr;
>
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> TreeTransform.h?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Mon Jan 30 04:44:11 2017
> @@ -307,17 +307,6 @@ public:
> ///
> QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
>
> - /// \brief Transform a type that is permitted to produce a
> - /// DeducedTemplateSpecializationType.
> - ///
> - /// This is used in the (relatively rare) contexts where it is
> acceptable
> - /// for transformation to produce a class template type with deduced
> - /// template arguments.
> - /// @{
> - QualType TransformTypeWithDeducedTST(QualType T);
> - TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
> - /// @}
> -
> /// \brief Transform the given statement.
> ///
> /// By default, this routine transforms a statement by delegating to the
> @@ -909,7 +898,7 @@ public:
> /// By default, builds a new ParenType type from the inner type.
> /// Subclasses may override this routine to provide different behavior.
> QualType RebuildParenType(QualType InnerType) {
> - return SemaRef.BuildParenType(InnerType);
> + return SemaRef.Context.getParenType(InnerType);
> }
>
> /// \brief Build a new qualified name type.
> @@ -979,8 +968,7 @@ public:
> SourceLocation KeywordLoc,
> NestedNameSpecifierLoc QualifierLoc,
> const IdentifierInfo *Id,
> - SourceLocation IdLoc,
> - bool DeducedTSTContext) {
> + SourceLocation IdLoc) {
> CXXScopeSpec SS;
> SS.Adopt(QualifierLoc);
>
> @@ -992,25 +980,9 @@ public:
> Id);
> }
>
> - if (Keyword == ETK_None || Keyword == ETK_Typename) {
> - QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc,
> QualifierLoc,
> - *Id, IdLoc);
> - // If a dependent name resolves to a deduced template
> specialization type,
> - // check that we're in one of the syntactic contexts permitting it.
> - if (!DeducedTSTContext) {
> - if (auto *Deduced = dyn_cast_or_null<
> DeducedTemplateSpecializationType>(
> - T.isNull() ? nullptr : T->getContainedDeducedType())) {
> - SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
> - << (int)SemaRef.getTemplateNameKindForDiagnostics(
> - Deduced->getTemplateName())
> - << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(),
> 0);
> - if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
> - SemaRef.Diag(TD->getLocation(),
> diag::note_template_decl_here);
> - return QualType();
> - }
> - }
> - return T;
> - }
> + if (Keyword == ETK_None || Keyword == ETK_Typename)
> + return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
> + *Id, IdLoc);
>
> TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(
> Keyword);
>
> @@ -3185,10 +3157,6 @@ private:
> TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType
> ObjectType,
> NamedDecl
> *FirstQualifierInScope,
> CXXScopeSpec &SS);
> -
> - QualType TransformDependentNameType(TypeLocBuilder &TLB,
> - DependentNameTypeLoc TL,
> - bool DeducibleTSTContext);
> };
>
> template<typename Derived>
> @@ -4080,52 +4048,6 @@ TreeTransform<Derived>::TransformType(Ty
> llvm_unreachable("unhandled type loc!");
> }
>
> -template<typename Derived>
> -QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T)
> {
> - if (!isa<DependentNameType>(T))
> - return TransformType(T);
> -
> - if (getDerived().AlreadyTransformed(T))
> - return T;
> - TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
> -
> getDerived().getBaseLocation());
> - TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
> - return NewDI ? NewDI->getType() : QualType();
> -}
> -
> -template<typename Derived>
> -TypeSourceInfo *
> -TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
> - if (!isa<DependentNameType>(DI->getType()))
> - return TransformType(DI);
> -
> - // Refine the base location to the type's location.
> - TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
> - getDerived().getBaseEntity());
> - if (getDerived().AlreadyTransformed(DI->getType()))
> - return DI;
> -
> - TypeLocBuilder TLB;
> -
> - TypeLoc TL = DI->getTypeLoc();
> - TLB.reserve(TL.getFullDataSize());
> -
> - Qualifiers Quals;
> - if (auto QTL = TL.getAs<QualifiedTypeLoc>()) {
> - Quals = QTL.getType().getLocalQualifiers();
> - TL = QTL.getUnqualifiedLoc();
> - }
> -
> - auto DNTL = TL.castAs<DependentNameTypeLoc>();
> -
> - QualType Result = getDerived().TransformDependentNameType(
> - TLB, DNTL, /*DeducedTSTContext*/true);
> - if (Result.isNull())
> - return nullptr;
> -
> - return TLB.getTypeSourceInfo(SemaRef.Context, Result);
> -}
> -
> /// FIXME: By default, this routine adds type qualifiers only to types
> /// that can have qualifiers, and silently suppresses those qualifiers
> /// that are not permitted (e.g., qualifiers on reference or function
> @@ -5932,14 +5854,8 @@ TreeTransform<Derived>::TransformParenTy
> }
>
> template<typename Derived>
> -QualType TreeTransform<Derived>::TransformDependentNameType(
> - TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
> - return TransformDependentNameType(TLB, TL, false);
> -}
> -
> -template<typename Derived>
> -QualType TreeTransform<Derived>::TransformDependentNameType(
> - TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext)
> {
> +QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder
> &TLB,
> +
> DependentNameTypeLoc TL) {
> const DependentNameType *T = TL.getTypePtr();
>
> NestedNameSpecifierLoc QualifierLoc
> @@ -5952,8 +5868,7 @@ QualType TreeTransform<Derived>::Transfo
> TL.getElaboratedKeywordLoc(),
> QualifierLoc,
> T->getIdentifier(),
> - TL.getNameLoc(),
> - DeducedTSTContext);
> + TL.getNameLoc());
> if (Result.isNull())
> return QualType();
>
> @@ -9559,8 +9474,7 @@ template<typename Derived>
> ExprResult
> TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
>
> CXXFunctionalCastExpr *E) {
> - TypeSourceInfo *Type =
> - getDerived().TransformTypeWithDeducedTST(E-
> >getTypeInfoAsWritten());
> + TypeSourceInfo *Type = getDerived().TransformType(E->
> getTypeInfoAsWritten());
> if (!Type)
> return ExprError();
>
> @@ -9749,8 +9663,8 @@ template<typename Derived>
> ExprResult
> TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
> // Transform the type that we're allocating
> - TypeSourceInfo *AllocTypeInfo =
> - getDerived().TransformTypeWithDeducedTST(E-
> >getAllocatedTypeSourceInfo());
> + TypeSourceInfo *AllocTypeInfo
> + = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
> if (!AllocTypeInfo)
> return ExprError();
>
> @@ -10461,8 +10375,7 @@ template<typename Derived>
> ExprResult
> TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
>
> CXXTemporaryObjectExpr *E) {
> - TypeSourceInfo *T =
> - getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
> + TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
> if (!T)
> return ExprError();
>
> @@ -10759,8 +10672,7 @@ template<typename Derived>
> ExprResult
> TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
>
> CXXUnresolvedConstructExpr *E) {
> - TypeSourceInfo *T =
> - getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
> + TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
> if (!T)
> return ExprError();
>
>
> Modified: cfe/trunk/test/Parser/cxx1z-class-template-argument-
> deduction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/
> cxx1z-class-template-argument-deduction.cpp?rev=293473&r1=
> 293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Parser/cxx1z-class-template-argument-deduction.cpp
> (original)
> +++ cfe/trunk/test/Parser/cxx1z-class-template-argument-deduction.cpp Mon
> Jan 30 04:44:11 2017
> @@ -1,6 +1,6 @@
> // RUN: %clang_cc1 -std=c++1z -fcxx-exceptions -verify %s
>
> -template<typename T> struct A {}; // expected-note 35{{declared here}}
> +template<typename T> struct A {}; // expected-note 31{{declared here}}
>
> // Make sure we still correctly parse cases where a template can appear
> without arguments.
> namespace template_template_arg {
> @@ -101,8 +101,6 @@ namespace expr {
> (void)reinterpret_cast<A*>(&n); // expected-error{{requires template
> arguments; argument deduction not allowed here}}
> (void)const_cast<A>(n); // expected-error{{requires template
> arguments; argument deduction not allowed here}}
> (void)*(A*)(&n); // expected-error{{requires template arguments;
> argument deduction not allowed here}}
> - (void)(A)(n); // expected-error{{requires template arguments;
> argument deduction not allowed here}}
> - (void)(A){n}; // expected-error{{requires template arguments;
> argument deduction not allowed here}}
>
> (void)A(n); // expected-error {{not yet supported}}
> (void)A{n}; // expected-error {{not yet supported}}
> @@ -123,7 +121,6 @@ namespace decl {
>
> A a; // expected-error {{requires an initializer}}
> A b = 0; // expected-error {{not yet supported}}
> - const A c = 0; // expected-error {{not yet supported}}
> A (parens) = 0; // expected-error {{cannot use parentheses when
> declaring variable with deduced class template specialization type}}
> A *p = 0; // expected-error {{cannot form pointer to deduced class
> template specialization type}}
> A &r = *p; // expected-error {{cannot form reference to deduced class
> template specialization type}}
> @@ -132,57 +129,3 @@ namespace decl {
> A (*fp)() = 0; // expected-error {{cannot form function returning
> deduced class template specialization type}}
> A [x, y] = 0; // expected-error {{cannot be declared with type 'A'}}
> expected-error {{not yet supported}}
> }
> -
> -namespace typename_specifier {
> - struct F {};
> -
> - void e() {
> - (void) typename ::A(0); // expected-error {{not yet supported}}
> - (void) typename ::A{0}; // expected-error {{not yet supported}}
> - new typename ::A(0); // expected-error {{not yet supported}}
> - new typename ::A{0}; // expected-error {{not yet supported}}
> - typename ::A a = 0; // expected-error {{not yet supported}}
> - const typename ::A b = 0; // expected-error {{not yet supported}}
> - if (typename ::A a = 0) {} // expected-error {{not yet supported}}
> - for (typename ::A a = 0; typename ::A b = 0; /**/) {} //
> expected-error 2{{not yet supported}}
> -
> - (void)(typename ::A)(0); // expected-error{{requires template
> arguments; argument deduction not allowed here}}
> - (void)(typename ::A){0}; // expected-error{{requires template
> arguments; argument deduction not allowed here}}
> - }
> - typename ::A a = 0; // expected-error {{not yet supported}}
> - const typename ::A b = 0; // expected-error {{not yet supported}}
> - typename ::A (parens) = 0; // expected-error {{cannot use parentheses
> when declaring variable with deduced class template specialization type}}
> - typename ::A *p = 0; // expected-error {{cannot form pointer to deduced
> class template specialization type}}
> - typename ::A &r = *p; // expected-error {{cannot form reference to
> deduced class template specialization type}}
> - typename ::A arr[3] = 0; // expected-error {{cannot form array of
> deduced class template specialization type}}
> - typename ::A F::*pm = 0; // expected-error {{cannot form pointer to
> deduced class template specialization type}}
> - typename ::A (*fp)() = 0; // expected-error {{cannot form function
> returning deduced class template specialization type}}
> - typename ::A [x, y] = 0; // expected-error {{cannot be declared with
> type 'typename ::A'}} expected-error {{not yet supported}}
> -
> - struct X { template<typename T> struct A {}; }; // expected-note
> 8{{template}}
> -
> - template<typename T> void f() {
> - (void) typename T::A(0); // expected-error {{not yet supported}}
> - (void) typename T::A{0}; // expected-error {{not yet supported}}
> - new typename T::A(0); // expected-error {{not yet supported}}
> - new typename T::A{0}; // expected-error {{not yet supported}}
> - typename T::A a = 0; // expected-error {{not yet supported}}
> - const typename T::A b = 0; // expected-error {{not yet supported}}
> - if (typename T::A a = 0) {} // expected-error {{not yet supported}}
> - for (typename T::A a = 0; typename T::A b = 0; /**/) {} //
> expected-error 2{{not yet supported}}
> -
> - {(void)(typename T::A)(0);} // expected-error{{refers to class
> template member}}
> - {(void)(typename T::A){0};} // expected-error{{refers to class
> template member}}
> - {typename T::A (parens) = 0;} // expected-error {{refers to class
> template member in 'typename_specifier::X'; argument deduction not allowed
> here}}
> - {typename T::A *p = 0;} // expected-error {{refers to class template
> member}}
> - {typename T::A &r = *p;} // expected-error {{refers to class template
> member}}
> - {typename T::A arr[3] = 0;} // expected-error {{refers to class
> template member}}
> - {typename T::A F::*pm = 0;} // expected-error {{refers to class
> template member}}
> - {typename T::A (*fp)() = 0;} // expected-error {{refers to class
> template member}}
> - {typename T::A [x, y] = 0;} // expected-error {{cannot be declared
> with type 'typename T::A'}} expected-error {{not yet supported}}
> - }
> - template void f<X>(); // expected-note {{instantiation of}}
> -
> - template<typename T> void g(typename T::A = 0); // expected-note
> {{refers to class template member}}
> - void h() { g<X>(); } // expected-error {{no matching function}}
> -}
>
> Modified: cfe/trunk/test/SemaCXX/cxx0x-class.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/cxx0x-class.cpp?rev=293473&r1=293472&r2=293473&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/cxx0x-class.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx0x-class.cpp Mon Jan 30 04:44:11 2017
> @@ -45,3 +45,11 @@ class DefaultMemberInitSelf {
> DefaultMemberTemplate<int> t = {};
> int *p = &t.n;
> };
> +
> +namespace composed_templates {
> + // Regression test -- obtaining the type from composed templates should
> not
> + // require out-of-line definition.
> + template <typename T> struct Zero { static const typename T::type value
> = 0; };
> + struct Integer { using type = int; };
> + template struct Zero<Integer>;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170130/310b6775/attachment-0001.html>
More information about the cfe-commits
mailing list