[clang][IFS] Prevent Clang-IFS from Leaking symbols from inside a block.
Built libdispatch with clang interface stubs. Ran into some block related issues. Basically VarDecl symbols can leak out because I wasn't checking the case where a VarDecl is contained inside a BlockDecl (versus a method or function). This patch checks that a VarDecl is not a child decl of a BlockDecl. This patch also does something very similar for c++ lambdas as well. Differential Revision: https://reviews.llvm.org/D71301
This commit is contained in:
@@ -53,6 +53,10 @@ class InterfaceStubFunctionsConsumer : public ASTConsumer {
|
||||
return true;
|
||||
|
||||
if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
|
||||
if (const auto *Parent = VD->getParentFunctionOrMethod())
|
||||
if (isa<BlockDecl>(Parent) || isa<CXXMethodDecl>(Parent))
|
||||
return true;
|
||||
|
||||
if ((VD->getStorageClass() == StorageClass::SC_Extern) ||
|
||||
(VD->getStorageClass() == StorageClass::SC_Static &&
|
||||
VD->getParentFunctionOrMethod() == nullptr))
|
||||
|
||||
9
clang/test/InterfaceStubs/blocks.c
Normal file
9
clang/test/InterfaceStubs/blocks.c
Normal file
@@ -0,0 +1,9 @@
|
||||
// RUN: %clang_cc1 -emit-interface-stubs -fblocks -o - %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: ...
|
||||
static void (^f)(void*) = ^(void* data) { int i; };
|
||||
10
clang/test/InterfaceStubs/lambda.cpp
Normal file
10
clang/test/InterfaceStubs/lambda.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
// RUN: %clang_cc1 -emit-interface-stubs -o - %s | FileCheck %s
|
||||
|
||||
// CHECK: --- !experimental-ifs-v1
|
||||
// CHECK-NEXT: IfsVersion: 1.0
|
||||
// CHECK-NEXT: Triple:
|
||||
// CHECK-NEXT: ObjectFileFormat: ELF
|
||||
// CHECK-NEXT: Symbols:
|
||||
// CHECK-NEXT: "f" : { Type: Object, Size: 1 }
|
||||
// CHECK-NEXT: ...
|
||||
auto f = [](void* data) { int i; };
|
||||
Reference in New Issue
Block a user