From: Matt Davis Date: Mon, 5 Nov 2018 17:25:26 +0000 (+0000) Subject: [AST] Get aliased type info from an aliased TemplateSpecialization. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a8770a7e8e8797a860773c2e0959274b1db4fc7a;p=clang [AST] Get aliased type info from an aliased TemplateSpecialization. Summary: Previously the TemplateSpecialization instance for 'template_alias', in the example below, returned the type info of the canonical type (int). This ignored the type alias if the template type happen to be aliased. Before this patch, the assert would trigger with an alignment of 4: ``` typedef int __attribute__(( aligned( 16 ) )) aligned_int; template < typename > using template_alias = aligned_int; static_assert( alignof( template_alias) == 16, "" ); ``` This patch checks if the TemplateSpecialization type has an alias, and if so will return the type information for the aliased type, else the canonical type's info is returned (original behavior). I believe that this is the desired behavior. Reviewers: aaron.ballman, rjmccall Reviewed By: rjmccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D54048 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@346146 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index cbcce8832e..f69e1172ac 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -4901,7 +4901,9 @@ public: return !isDependentType() || isCurrentInstantiation() || isTypeAlias(); } - QualType desugar() const { return getCanonicalTypeInternal(); } + QualType desugar() const { + return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal(); + } void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { Profile(ID, Template, template_arguments(), Ctx); diff --git a/test/SemaCXX/alignof.cpp b/test/SemaCXX/alignof.cpp index 2895cb9d46..f2854024da 100644 --- a/test/SemaCXX/alignof.cpp +++ b/test/SemaCXX/alignof.cpp @@ -97,3 +97,8 @@ struct S { typedef __attribute__((aligned(N))) int Field[sizeof(N)]; // expected-error {{requested alignment is dependent but declaration is not dependent}} }; } + +typedef int __attribute__((aligned(16))) aligned_int; +template +using template_alias = aligned_int; +static_assert(alignof(template_alias) == 16, "Expected alignment of 16" );