From 86b1bfad0509a1ad583ad7a68160bf741dbff636 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 31 Oct 2016 18:07:57 +0000 Subject: [PATCH] [Sema] Warn when alignof is used with __builtin_alloca_with_align The second argument to __builtin_alloca_with_align is supposed to be in bits, not bytes. Using alignof there would be indicative of a bug. llvm-svn: 285609 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 +++ clang/lib/Sema/SemaChecking.cpp | 8 +++++++- clang/test/Sema/builtin-alloca-with-align.c | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 085008753f9a..9d7cc015a477 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2440,6 +2440,9 @@ def err_no_accessor_for_property : Error< def error_cannot_find_suitable_accessor : Error< "cannot find suitable %select{getter|setter}0 for property %1">; +def warn_alloca_align_alignof : Warning< + "second argument to __builtin_alloca_with_align is supposed to be in bits">; + def err_alignment_too_small : Error< "requested alignment must be %0 or greater">; def err_alignment_too_big : Error< diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index a4e3c5b8b24c..4d9ad78189b3 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3907,7 +3907,7 @@ bool Sema::SemaBuiltinAssume(CallExpr *TheCall) { return false; } -/// Handle __builtin_assume_aligned. This is declared +/// Handle __builtin_alloca_with_align. This is declared /// as (size_t, size_t) where the second size_t must be a power of 2 greater /// than 8. bool Sema::SemaBuiltinAllocaWithAlign(CallExpr *TheCall) { @@ -3916,6 +3916,12 @@ bool Sema::SemaBuiltinAllocaWithAlign(CallExpr *TheCall) { // We can't check the value of a dependent argument. if (!Arg->isTypeDependent() && !Arg->isValueDependent()) { + if (const auto *UE = + dyn_cast(Arg->IgnoreParenImpCasts())) + if (UE->getKind() == UETT_AlignOf) + Diag(TheCall->getLocStart(), diag::warn_alloca_align_alignof) + << Arg->getSourceRange(); + llvm::APSInt Result = Arg->EvaluateKnownConstInt(Context); if (!Result.isPowerOf2()) diff --git a/clang/test/Sema/builtin-alloca-with-align.c b/clang/test/Sema/builtin-alloca-with-align.c index 67dc09d58ba0..16d71da60080 100644 --- a/clang/test/Sema/builtin-alloca-with-align.c +++ b/clang/test/Sema/builtin-alloca-with-align.c @@ -27,3 +27,7 @@ void test6(int a, int j) { void test7(int a) { __builtin_alloca_with_align(a, 2); // expected-error {{requested alignment must be 8 or greater}} } + +void test8() { + __builtin_alloca_with_align(sizeof(__INT64_TYPE__), __alignof__(__INT64_TYPE__)); // expected-warning {{second argument to __builtin_alloca_with_align is supposed to be in bits}} +}