зеркало из https://github.com/microsoft/clang-1.git
Thread-safety analysis: support new "pointer to member" syntax for
existentially quantified lock expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155357 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e656b8397f
Коммит
79747e00e9
|
@ -313,7 +313,11 @@ static void checkAttrArgsAreLockableObjs(Sema &S, Decl *D,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (isa<StringLiteral>(ArgExp)) {
|
||||
if (StringLiteral *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
|
||||
// Ignore empty strings without warnings
|
||||
if (StrLit->getLength() == 0)
|
||||
continue;
|
||||
|
||||
// We allow constant strings to be used as a placeholder for expressions
|
||||
// that are not valid C++ syntax, but warn that they are ignored.
|
||||
S.Diag(Attr.getLoc(), diag::warn_thread_attribute_ignored) <<
|
||||
|
@ -323,6 +327,14 @@ static void checkAttrArgsAreLockableObjs(Sema &S, Decl *D,
|
|||
|
||||
QualType ArgTy = ArgExp->getType();
|
||||
|
||||
// A pointer to member expression of the form &MyClass::mu is treated
|
||||
// specially -- we need to look at the type of the member.
|
||||
if (UnaryOperator *UOp = dyn_cast<UnaryOperator>(ArgExp))
|
||||
if (UOp->getOpcode() == UO_AddrOf)
|
||||
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
|
||||
if (DRE->getDecl()->isCXXInstanceMember())
|
||||
ArgTy = DRE->getDecl()->getType();
|
||||
|
||||
// First see if we can just cast to record type, or point to record type.
|
||||
const RecordType *RT = getRecordType(ArgTy);
|
||||
|
||||
|
|
|
@ -1341,5 +1341,20 @@ class Foo {
|
|||
|
||||
}
|
||||
|
||||
namespace PointerToMemberTest {
|
||||
|
||||
class Graph {
|
||||
public:
|
||||
Mu mu_;
|
||||
};
|
||||
|
||||
class Node {
|
||||
public:
|
||||
void foo() EXCLUSIVE_LOCKS_REQUIRED(&Graph::mu_);
|
||||
int a GUARDED_BY(&Graph::mu_);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
} // end namespace TestMultiDecl
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче