diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-09-28 18:35:06 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-09-28 18:35:06 +0000 |
commit | 83c337d600990479a2097149eb91a41f3bae087e (patch) | |
tree | a0c6e9567b4dac15ce809e7b06000bd9b80ca1f1 | |
parent | c0f53df8ff613aed5901edadb8dcfa7761ad164c (diff) | |
download | bcm5719-llvm-83c337d600990479a2097149eb91a41f3bae087e.tar.gz bcm5719-llvm-83c337d600990479a2097149eb91a41f3bae087e.zip |
For __weak/__strong/etc. ownership attributes, don't macro expand them in diagnostics.
llvm-svn: 140711
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index ad5d8b9a4e3..85112dbe21e 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3142,15 +3142,18 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, return false; Sema &S = state.getSema(); + SourceLocation AttrLoc = attr.getLoc(); + if (AttrLoc.isMacroID()) + AttrLoc = S.getSourceManager().getImmediateExpansionRange(AttrLoc).first; if (type.getQualifiers().getObjCLifetime()) { - S.Diag(attr.getLoc(), diag::err_attr_objc_ownership_redundant) + S.Diag(AttrLoc, diag::err_attr_objc_ownership_redundant) << type; return true; } if (!attr.getParameterName()) { - S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string) + S.Diag(AttrLoc, diag::err_attribute_argument_n_not_string) << "objc_ownership" << 1; attr.setInvalid(); return true; @@ -3166,7 +3169,7 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, else if (attr.getParameterName()->isStr("autoreleasing")) lifetime = Qualifiers::OCL_Autoreleasing; else { - S.Diag(attr.getLoc(), diag::warn_attribute_type_not_supported) + S.Diag(AttrLoc, diag::warn_attribute_type_not_supported) << "objc_ownership" << attr.getParameterName(); attr.setInvalid(); return true; @@ -3184,7 +3187,7 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, // If we have a valid source location for the attribute, use an // AttributedType instead. - if (attr.getLoc().isValid()) + if (AttrLoc.isValid()) type = S.Context.getAttributedType(AttributedType::attr_objc_ownership, origType, type); @@ -3195,10 +3198,11 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, // Actually, delay this until we know what we're parsing. if (S.DelayedDiagnostics.shouldDelayDiagnostics()) { S.DelayedDiagnostics.add( - sema::DelayedDiagnostic::makeForbiddenType(attr.getLoc(), + sema::DelayedDiagnostic::makeForbiddenType( + S.getSourceManager().getExpansionLoc(AttrLoc), diag::err_arc_weak_no_runtime, type, /*ignored*/ 0)); } else { - S.Diag(attr.getLoc(), diag::err_arc_weak_no_runtime); + S.Diag(AttrLoc, diag::err_arc_weak_no_runtime); } attr.setInvalid(); @@ -3214,7 +3218,7 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, if (const ObjCObjectPointerType *ObjT = T->getAs<ObjCObjectPointerType>()) { ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl(); if (Class->isArcWeakrefUnavailable()) { - S.Diag(attr.getLoc(), diag::err_arc_unsupported_weak_class); + S.Diag(AttrLoc, diag::err_arc_unsupported_weak_class); S.Diag(ObjT->getInterfaceDecl()->getLocation(), diag::note_class_declared); } |