[PATCH] [Sema] Don't permit dependent alignments on non-dependent typedef-names

Aaron Ballman aaron at aaronballman.com
Mon Apr 6 15:54:17 PDT 2015


LGTM

~Aaron

On Sun, Mar 29, 2015 at 10:13 PM, David Majnemer
<david.majnemer at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list