aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hines <srhines@google.com>2012-08-04 15:13:40 -0700
committerStephen Hines <srhines@google.com>2012-08-04 15:15:29 -0700
commitab5a535b290d898d0c56036f642d823e3472a804 (patch)
treec8f0e54ebe6722c028a0290696c17b8a60eb1f5a
parent0a813a3ef2a82f19d7eab9e23ae8493197143803 (diff)
downloadandroid_frameworks_compile_slang-ab5a535b290d898d0c56036f642d823e3472a804.tar.gz
android_frameworks_compile_slang-ab5a535b290d898d0c56036f642d823e3472a804.tar.bz2
android_frameworks_compile_slang-ab5a535b290d898d0c56036f642d823e3472a804.zip
Add RS-specific check forbidding array parameters in exported functions.
BUG=6902660 Change-Id: I31f0f2b51026edf450e920a5dd49810f4b191eb0
-rw-r--r--slang_rs_backend.cpp14
-rw-r--r--tests/F_const_array_arg/stderr.txt.expect2
2 files changed, 15 insertions, 1 deletions
diff --git a/slang_rs_backend.cpp b/slang_rs_backend.cpp
index 2ccb2ad..d0b067e 100644
--- a/slang_rs_backend.cpp
+++ b/slang_rs_backend.cpp
@@ -104,6 +104,20 @@ bool RSBackend::HandleTopLevelDecl(clang::DeclGroupRef D) {
for (clang::DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; I++) {
clang::FunctionDecl *FD = llvm::dyn_cast<clang::FunctionDecl>(*I);
if (FD && FD->isGlobal()) {
+ // Check that we don't have any array parameters being misintrepeted as
+ // kernel pointers due to the C type system's array to pointer decay.
+ size_t numParams = FD->getNumParams();
+ for (size_t i = 0; i < numParams; i++) {
+ const clang::ParmVarDecl *PVD = FD->getParamDecl(i);
+ clang::QualType QT = PVD->getOriginalType();
+ if (QT->isArrayType()) {
+ mDiagEngine.Report(
+ clang::FullSourceLoc(PVD->getTypeSpecStartLoc(), mSourceMgr),
+ mDiagEngine.getCustomDiagID(clang::DiagnosticsEngine::Error,
+ "exported function parameters may "
+ "not have array type: %0")) << QT;
+ }
+ }
AnnotateFunction(FD);
}
}
diff --git a/tests/F_const_array_arg/stderr.txt.expect b/tests/F_const_array_arg/stderr.txt.expect
index 1572005..9b7ad1d 100644
--- a/tests/F_const_array_arg/stderr.txt.expect
+++ b/tests/F_const_array_arg/stderr.txt.expect
@@ -1 +1 @@
-const_array_arg.rs:4:10: error: parameters may not have array type: 'float [3]'
+const_array_arg.rs:4:10: error: exported function parameters may not have array type: 'float [3]'