diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-01-15 10:04:14 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-01-15 10:04:14 +0000 |
| commit | 10fd83d11f6f65380f3e0355754e7044ebc5a619 (patch) | |
| tree | 77e9ce4c96c98042967afdac8b851c8d518c9d24 | |
| parent | 9fdd078afbab5428b288c32bf7aa9e540cdeb4a7 (diff) | |
| download | bcm5719-llvm-10fd83d11f6f65380f3e0355754e7044ebc5a619.tar.gz bcm5719-llvm-10fd83d11f6f65380f3e0355754e7044ebc5a619.zip | |
AST: alignof might be dependent because of alignment attributes
Dependent alignment attributes should make an alignof expression
dependent as well.
llvm-svn: 226156
| -rw-r--r-- | clang/include/clang/AST/Expr.h | 13 | ||||
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 38 | ||||
| -rw-r--r-- | clang/test/SemaCXX/alignof.cpp | 7 |
3 files changed, 46 insertions, 12 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index c410f2358bc..96131d2b932 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -1997,18 +1997,7 @@ public: UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E, QualType resultType, SourceLocation op, - SourceLocation rp) : - Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary, - false, // Never type-dependent (C++ [temp.dep.expr]p3). - // Value-dependent if the argument is type-dependent. - E->isTypeDependent(), - E->isInstantiationDependent(), - E->containsUnexpandedParameterPack()), - OpLoc(op), RParenLoc(rp) { - UnaryExprOrTypeTraitExprBits.Kind = ExprKind; - UnaryExprOrTypeTraitExprBits.IsType = false; - Argument.Ex = E; - } + SourceLocation rp); /// \brief Construct an empty sizeof/alignof expression. explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty) diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 712de5056e8..e7b7f20c120 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1360,6 +1360,44 @@ IdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const { return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask); } +UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr( + UnaryExprOrTypeTrait ExprKind, Expr *E, QualType resultType, + SourceLocation op, SourceLocation rp) + : Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary, + false, // Never type-dependent (C++ [temp.dep.expr]p3). + // Value-dependent if the argument is type-dependent. + E->isTypeDependent(), E->isInstantiationDependent(), + E->containsUnexpandedParameterPack()), + OpLoc(op), RParenLoc(rp) { + UnaryExprOrTypeTraitExprBits.Kind = ExprKind; + UnaryExprOrTypeTraitExprBits.IsType = false; + Argument.Ex = E; + + // Check to see if we are in the situation where alignof(decl) should be + // dependent because decl's alignment is dependent. + if (ExprKind == UETT_AlignOf) { + if (!isValueDependent() || !isInstantiationDependent()) { + E = E->IgnoreParens(); + + const ValueDecl *D = nullptr; + if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) + D = DRE->getDecl(); + else if (const auto *ME = dyn_cast<MemberExpr>(E)) + D = ME->getMemberDecl(); + + if (D) { + for (const auto *I : D->specific_attrs<AlignedAttr>()) { + if (I->isAlignmentDependent()) { + setValueDependent(true); + setInstantiationDependent(true); + break; + } + } + } + } + } +} + MemberExpr *MemberExpr::Create(const ASTContext &C, Expr *base, bool isarrow, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, diff --git a/clang/test/SemaCXX/alignof.cpp b/clang/test/SemaCXX/alignof.cpp index 011f459abdf..f51146ccd3c 100644 --- a/clang/test/SemaCXX/alignof.cpp +++ b/clang/test/SemaCXX/alignof.cpp @@ -77,3 +77,10 @@ namespace alignof_array_expr { // ok, does not complete type of S<-1>::a static_assert(alignof(S<-1>::a) == alignof(int), ""); // expected-warning {{GNU extension}} } + +template <typename T> void n(T) { + alignas(T) int T1; + char k[__alignof__(T1)]; + static_assert(sizeof(k) == alignof(long long), ""); +} +template void n(long long); |

