LGTM ~Aaron
On Sun, Mar 29, 2015 at 10:13 PM, David Majnemer <[email protected]> wrote: > Hi rsmith, > > A dependent alignment attribute (like __attribute__((aligned(...))) or > __declspec(align(...))) on a non-dependent typedef or using declaration > poses a considerable challenge: the type is _not_ dependent, the size > _may_ be dependent if the type is used as an array type, the alignment > _is_ dependent. > > It is reasonable for a compiler to be able to query the size and > alignment of a complete type. Let's help that become an invariant. > > This fixes PR22042. > > http://reviews.llvm.org/D8693 > > Files: > include/clang/Basic/DiagnosticSemaKinds.td > lib/Sema/SemaDeclAttr.cpp > test/SemaCXX/alignof.cpp > > Index: include/clang/Basic/DiagnosticSemaKinds.td > =================================================================== > --- include/clang/Basic/DiagnosticSemaKinds.td > +++ include/clang/Basic/DiagnosticSemaKinds.td > @@ -2134,6 +2134,8 @@ > > def err_alignment_not_power_of_two : Error< > "requested alignment is not a power of 2">; > +def err_alignment_dependent_typedef_name : Error< > + "requested alignment is dependent but declaration is not dependent">; > > def err_attribute_aligned_too_great : Error< > "requested alignment must be %0 bytes or smaller">; > Index: lib/Sema/SemaDeclAttr.cpp > =================================================================== > --- lib/Sema/SemaDeclAttr.cpp > +++ lib/Sema/SemaDeclAttr.cpp > @@ -2863,6 +2863,17 @@ > if (!Attr.isPackExpansion() && S.DiagnoseUnexpandedParameterPack(E)) > return; > > + if (E->isTypeDependent() || E->isValueDependent()) { > + if (const auto *TND = dyn_cast<TypedefNameDecl>(D)) { > + QualType T = TND->getUnderlyingType(); > + if (!T->isDependentType() && !T->isInstantiationDependentType()) { > + S.Diag(Attr.getLoc(), diag::err_alignment_dependent_typedef_name) > + << E->getSourceRange(); > + return; > + } > + } > + } > + > S.AddAlignedAttr(Attr.getRange(), D, E, > Attr.getAttributeSpellingListIndex(), > Attr.isPackExpansion()); > } > Index: test/SemaCXX/alignof.cpp > =================================================================== > --- test/SemaCXX/alignof.cpp > +++ test/SemaCXX/alignof.cpp > @@ -84,3 +84,11 @@ > static_assert(sizeof(k) == alignof(long long), ""); > } > template void n(long long); > + > +namespace PR22042 { > +template <typename T> > +void Fun(T A) { > + typedef int __attribute__((__aligned__(A))) T1; // expected-error > {{requested alignment is dependent but declaration is not dependent}} > + int k1[__alignof__(T1)]; > +} > +} > > EMAIL PREFERENCES > http://reviews.llvm.org/settings/panel/emailpreferences/ > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
