зеркало из https://github.com/microsoft/clang-1.git
Added a test case for __weak field decls. Change SetVarDeclObjCAttribute
to static function. Added comments. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59738 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
dd95d6cca5
Коммит
80b0b42a09
|
@ -523,18 +523,19 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
|
|||
|
||||
/// SetVarDeclObjCAttribute - Set __weak/__strong attributes into the LValue
|
||||
/// object.
|
||||
void CodeGenFunction::SetVarDeclObjCAttribute(const VarDecl *VD,
|
||||
const QualType &Ty,
|
||||
LValue &LV)
|
||||
static void SetVarDeclObjCAttribute(ASTContext &Ctx, const VarDecl *VD,
|
||||
const QualType &Ty, LValue &LV)
|
||||
{
|
||||
if (const ObjCGCAttr *A = VD->getAttr<ObjCGCAttr>()) {
|
||||
ObjCGCAttr::GCAttrTypes attrType = A->getType();
|
||||
LValue::SetObjCType(attrType == ObjCGCAttr::Weak,
|
||||
attrType == ObjCGCAttr::Strong, LV);
|
||||
}
|
||||
else if (CGM.getLangOptions().ObjC1 &&
|
||||
CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
|
||||
if (getContext().isObjCObjectPointerType(Ty))
|
||||
else if (Ctx.getLangOptions().ObjC1 &&
|
||||
Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) {
|
||||
// Default behavious under objective-c's gc is for objective-c pointers
|
||||
// be treated as though they were declared as __strong.
|
||||
if (Ctx.isObjCObjectPointerType(Ty))
|
||||
LValue::SetObjCType(false, true, LV);
|
||||
}
|
||||
}
|
||||
|
@ -557,12 +558,12 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
|
|||
if (VD->isBlockVarDecl() &&
|
||||
(VD->getStorageClass() == VarDecl::Static ||
|
||||
VD->getStorageClass() == VarDecl::Extern))
|
||||
SetVarDeclObjCAttribute(VD, E->getType(), LV);
|
||||
SetVarDeclObjCAttribute(getContext(), VD, E->getType(), LV);
|
||||
return LV;
|
||||
} else if (VD && VD->isFileVarDecl()) {
|
||||
LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
|
||||
E->getType().getCVRQualifiers());
|
||||
SetVarDeclObjCAttribute(VD, E->getType(), LV);
|
||||
SetVarDeclObjCAttribute(getContext(), VD, E->getType(), LV);
|
||||
return LV;
|
||||
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) {
|
||||
return LValue::MakeAddr(CGM.GetAddrOfFunction(FD),
|
||||
|
|
|
@ -462,8 +462,6 @@ public:
|
|||
LValue EmitBinaryOperatorLValue(const BinaryOperator *E);
|
||||
// Note: only availabe for agg return types
|
||||
LValue EmitCallExprLValue(const CallExpr *E);
|
||||
void SetVarDeclObjCAttribute(const VarDecl *VD, const QualType &Ty,
|
||||
LValue &LV);
|
||||
LValue EmitDeclRefLValue(const DeclRefExpr *E);
|
||||
LValue EmitStringLiteralLValue(const StringLiteral *E);
|
||||
LValue EmitPredefinedFunctionName(unsigned Type);
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
// RUN: clang -fsyntax-only -fobjc-gc -verify %s
|
||||
|
||||
struct S {
|
||||
__weak id w; // expected-warning {{__weak attribute cannot be specified on a field declaration}}
|
||||
__strong id p1;
|
||||
};
|
||||
|
||||
int main ()
|
||||
{
|
||||
struct I {
|
||||
__weak id w1; // expected-warning {{__weak attribute cannot be specified on a field declaration}}
|
||||
};
|
||||
}
|
Загрузка…
Ссылка в новой задаче