[cfe-commits] r59682 - in /cfe/trunk: include/clang/Basic/DiagnosticKinds.def lib/CodeGen/CGExpr.cpp lib/CodeGen/CodeGenFunction.h lib/Sema/SemaDeclAttr.cpp

Daniel Dunbar daniel at zuster.org
Thu Nov 20 09:30:34 PST 2008


One more comment I forgot. Please add a test case for the diagnostic.
Our -verify option is quite useful for this, see the tests in
test/Sema for many examples of what to do.

 - Daniel

On Thu, Nov 20, 2008 at 9:04 AM, Daniel Dunbar <daniel at zuster.org> wrote:
> Hi Fariborz,
>
> A few comments:
>
> For readability consider splitting commits which hit several layers
> (Parser/Sema/CodeGen) into independent commits.
>
> On Wed, Nov 19, 2008 at 4:15 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
>> +DIAG(warn_attribute_weak_on_field, WARNING,
>> +     "__weak attribute cannot be specified on a field declaration")
>
> This spelling strikes me as odd, since __weak is just a define. I
> presume this matches gcc though?
>
>> +/// SetVarDeclObjCAttribute - Set __weak/__strong attributes into the LValue
>> +/// object.
>> +void CodeGenFunction::SetVarDeclObjCAttribute(const VarDecl *VD,
>> +                                              const QualType &Ty,
>> +                                              LValue &LV)
>> +{
>
> I think this should be a static function instead of a member function,
> which is slightly preferable. It just needs the ASTContext as an
> argument (the ASTContext has a getLangOptions).
>
>> +  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))
>> +      LValue::SetObjCType(false, true, LV);
>
> Although its fairly obvious what this is doing for ObjC-1, can you add
> a comment about it, preferably with a reference to something (e.g., a
> radar) which defines this behavior if one exists.
>
>> +  }
>> +}
>>
>>  LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
>>   const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl());
>>
>>   if (VD && (VD->isBlockVarDecl() || isa<ParmVarDecl>(VD) ||
>>         isa<ImplicitParamDecl>(VD))) {
>> -    if (VD->getStorageClass() == VarDecl::Extern)
>> -      return LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
>> -                              E->getType().getCVRQualifiers());
>> +    LValue LV;
>> +    if (VD->getStorageClass() == VarDecl::Extern) {
>> +      LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
>> +                            E->getType().getCVRQualifiers());
>> +    }
>>     else {
>>       llvm::Value *V = LocalDeclMap[VD];
>>       assert(V && "BlockVarDecl not entered in LocalDeclMap?");
>> -      return LValue::MakeAddr(V, E->getType().getCVRQualifiers());
>> +      LV = LValue::MakeAddr(V, E->getType().getCVRQualifiers());
>>     }
>> +    if (VD->isBlockVarDecl() &&
>> +        (VD->getStorageClass() == VarDecl::Static ||
>> +         VD->getStorageClass() == VarDecl::Extern))
>> +      SetVarDeclObjCAttribute(VD, E->getType(), LV);
>> +    return LV;
>>   } else if (VD && VD->isFileVarDecl()) {
>>     LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
>>                                  E->getType().getCVRQualifiers());
>> -    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) {
>> -      QualType ExprTy = E->getType();
>> -      if (getContext().isObjCObjectPointerType(ExprTy))
>> -        LValue::SetObjCType(false, true, LV);
>> -    }
>> +    SetVarDeclObjCAttribute(VD, E->getType(), LV);
>>     return LV;
>>   } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) {
>>     return LValue::MakeAddr(CGM.GetAddrOfFunction(FD),
>> @@ -767,7 +782,7 @@
>>                                 Field->getType()->isSignedIntegerType(),
>>                             Field->getType().getCVRQualifiers()|CVRQualifiers);
>>   }
>> -
>> +
>>   V = Builder.CreateStructGEP(BaseValue, idx, "tmp");
>>
>>   // Match union field type.
>> @@ -782,8 +797,21 @@
>>                               "tmp");
>>   }
>>
>> -  return LValue::MakeAddr(V,
>> -                          Field->getType().getCVRQualifiers()|CVRQualifiers);
>> +  LValue LV =
>> +    LValue::MakeAddr(V,
>> +                     Field->getType().getCVRQualifiers()|CVRQualifiers);
>> +  if (const ObjCGCAttr *A = Field->getAttr<ObjCGCAttr>()) {
>> +    ObjCGCAttr::GCAttrTypes attrType = A->getType();
>> +    // __weak attribute on a field is ignored.
>> +    LValue::SetObjCType(false, attrType == ObjCGCAttr::Strong, LV);
>
> This special casing for weak shouldn't need to be done here, instead
> Sema should make sure this situation does not occur. I think this can
> simply assert that this holds and then use SetObjCType.
>
>> +  }
>> +  else if (CGM.getLangOptions().ObjC1 &&
>> +           CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
>> +    QualType ExprTy = Field->getType();
>> +    if (getContext().isObjCObjectPointerType(ExprTy))
>> +      LValue::SetObjCType(false, true, LV);
>> +  }
>> +  return LV;
>>  }
>>
>>  LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr* E)
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=59682&r1=59681&r2=59682&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Wed Nov 19 18:15:42 2008
>> @@ -462,7 +462,8 @@
>>   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);
>>
>> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=59682&r1=59681&r2=59682&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Nov 19 18:15:42 2008
>> @@ -555,8 +555,11 @@
>>
>>
>>   ObjCGCAttr::GCAttrTypes type;
>> -  if (Attr.getParameterName()->isName("weak"))
>> +  if (Attr.getParameterName()->isName("weak")) {
>> +    if (isa<FieldDecl>(d))
>> +      S.Diag(Attr.getLoc(), diag::warn_attribute_weak_on_field);
>>     type = ObjCGCAttr::Weak;
>
> This shouldn't add the weak attribute on the path with the diagnostic.
>
> Thanks,
>  - Daniel
>



More information about the cfe-commits mailing list