def WarnUnused : InheritableAttr {
let Spellings = [GNU<"warn_unused">];
-// let Subjects = [Record];
+ let Subjects = SubjectList<[Record]>;
}
def WarnUnusedResult : InheritableAttr {
Attr.getAttributeSpellingListIndex()));
}
-static void handleWarnUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
- if (RecordDecl *RD = dyn_cast<RecordDecl>(D))
- RD->addAttr(::new (S.Context) WarnUnusedAttr(Attr.getRange(), S.Context));
- else
- S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
-}
-
static void handleWarnUnusedResult(Sema &S, Decl *D, const AttributeList &Attr) {
if (!isFunction(D) && !isa<ObjCMethodDecl>(D) && !isa<CXXRecordDecl>(D)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
handleVisibilityAttr(S, D, Attr, true);
break;
case AttributeList::AT_WarnUnused:
- handleWarnUnusedAttr(S, D, Attr);
- break;
+ handleSimpleAttribute<WarnUnusedAttr>(S, D, Attr); break;
case AttributeList::AT_WarnUnusedResult: handleWarnUnusedResult(S, D, Attr);
break;
case AttributeList::AT_Weak: handleWeakAttr (S, D, Attr); break;
// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -verify %s
-struct __attribute__((warn_unused)) Test
-{
- Test();
- ~Test();
- void use();
+struct __attribute__((warn_unused)) Test {
+ Test();
+ ~Test();
+ void use();
};
-struct TestNormal
-{
- TestNormal();
+struct TestNormal {
+ TestNormal();
};
-int main()
-{
- Test unused; // expected-warning {{unused variable 'unused'}}
- Test used;
- TestNormal normal;
- used.use();
+int main(void) {
+ Test unused; // expected-warning {{unused variable 'unused'}}
+ Test used;
+ TestNormal normal;
+ used.use();
+
+ int i __attribute__((warn_unused)) = 12; // expected-warning {{'warn_unused' attribute only applies to struct, union or class}}
+ return i;
}