summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2016-01-26 17:47:20 +0000
committerJustin Lebar <jlebar@google.com>2016-01-26 17:47:20 +0000
commit1eac5948dbf95abab5af7162dea7cf1d34585373 (patch)
tree491efb0080da4a7b42490a615c7b0beb23215fb1 /clang/lib/Sema/SemaDecl.cpp
parent329860e495667aa3caab095f5e6032ffc4d4dcfd (diff)
downloadbcm5719-llvm-1eac5948dbf95abab5af7162dea7cf1d34585373.tar.gz
bcm5719-llvm-1eac5948dbf95abab5af7162dea7cf1d34585373.zip
[CUDA] Add -fcuda-allow-variadic-functions.
Summary: Turns out the variadic function checking added in r258643 was too strict for some existing users; give them an escape valve. When -fcuda-allow-variadic-functions is passed, the front-end makes no attempt to disallow C-style variadic functions. Calls to va_arg are still not allowed. Reviewers: tra Subscribers: cfe-commits, jhen, echristo, bkramer Differential Revision: http://reviews.llvm.org/D16559 llvm-svn: 258822
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index e3365b559a7..166bd8ca24e 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8290,9 +8290,11 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
}
// Variadic functions, other than a *declaration* of printf, are not allowed
- // in device-side CUDA code.
- if (NewFD->isVariadic() && (NewFD->hasAttr<CUDADeviceAttr>() ||
- NewFD->hasAttr<CUDAGlobalAttr>()) &&
+ // in device-side CUDA code, unless someone passed
+ // -fcuda-allow-variadic-functions.
+ if (!getLangOpts().CUDAAllowVariadicFunctions && NewFD->isVariadic() &&
+ (NewFD->hasAttr<CUDADeviceAttr>() ||
+ NewFD->hasAttr<CUDAGlobalAttr>()) &&
!(II && II->isStr("printf") && NewFD->isExternC() &&
!D.isFunctionDefinition())) {
Diag(NewFD->getLocation(), diag::err_variadic_device_fn);
OpenPOWER on IntegriCloud