I said WG14 N2050 when I meant N2051. My fat fingers and I apologize for the confusion with the commit log.
~Aaron On Tue, Oct 17, 2017 at 4:33 PM, Aaron Ballman via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: aaronballman > Date: Tue Oct 17 13:33:35 2017 > New Revision: 316026 > > URL: http://llvm.org/viewvc/llvm-project?rev=316026&view=rev > Log: > Enable support for the [[nodiscard]] attribute from WG14 N2050 when enabling > double square bracket attributes in C code. > > Added: > cfe/trunk/test/Sema/c2x-nodiscard.c > Modified: > cfe/trunk/include/clang/Basic/Attr.td > cfe/trunk/lib/AST/Decl.cpp > > Modified: cfe/trunk/include/clang/Basic/Attr.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=316026&r1=316025&r2=316026&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/Attr.td (original) > +++ cfe/trunk/include/clang/Basic/Attr.td Tue Oct 17 13:33:35 2017 > @@ -2004,10 +2004,10 @@ def WarnUnused : InheritableAttr { > } > > def WarnUnusedResult : InheritableAttr { > - let Spellings = [CXX11<"", "nodiscard", 201603>, > + let Spellings = [CXX11<"", "nodiscard", 201603>, C2x<"", "nodiscard">, > CXX11<"clang", "warn_unused_result">, > GCC<"warn_unused_result">]; > - let Subjects = SubjectList<[ObjCMethod, Enum, CXXRecord, FunctionLike], > + let Subjects = SubjectList<[ObjCMethod, Enum, Record, FunctionLike], > WarnDiag, "ExpectedFunctionMethodEnumOrClass">; > let Documentation = [WarnUnusedResultsDocs]; > } > > Modified: cfe/trunk/lib/AST/Decl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=316026&r1=316025&r2=316026&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/Decl.cpp (original) > +++ cfe/trunk/lib/AST/Decl.cpp Tue Oct 17 13:33:35 2017 > @@ -3056,7 +3056,8 @@ SourceRange FunctionDecl::getExceptionSp > const Attr *FunctionDecl::getUnusedResultAttr() const { > QualType RetType = getReturnType(); > if (RetType->isRecordType()) { > - if (const CXXRecordDecl *Ret = RetType->getAsCXXRecordDecl()) { > + if (const auto *Ret = > + dyn_cast_or_null<RecordDecl>(RetType->getAsTagDecl())) { > if (const auto *R = Ret->getAttr<WarnUnusedResultAttr>()) > return R; > } > > Added: cfe/trunk/test/Sema/c2x-nodiscard.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/c2x-nodiscard.c?rev=316026&view=auto > ============================================================================== > --- cfe/trunk/test/Sema/c2x-nodiscard.c (added) > +++ cfe/trunk/test/Sema/c2x-nodiscard.c Tue Oct 17 13:33:35 2017 > @@ -0,0 +1,49 @@ > +// RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify > %s > + > +struct [[nodiscard]] S1 { // ok > + int i; > +}; > +struct [[nodiscard nodiscard]] S2 { // expected-error {{attribute > 'nodiscard' cannot appear multiple times in an attribute specifier}} > + int i; > +}; > +struct [[nodiscard("Wrong")]] S3 { // expected-error {{'nodiscard' cannot > have an argument list}} > + int i; > +}; > + > +[[nodiscard]] int f1(void); > +enum [[nodiscard]] E1 { One }; > + > +[[nodiscard]] int i; // expected-warning {{'nodiscard' attribute only > applies to functions, methods, enums, and classes}} > + > +struct [[nodiscard]] S4 { > + int i; > +}; > +struct S4 get_s(void); > + > +enum [[nodiscard]] E2 { Two }; > +enum E2 get_e(void); > + > +[[nodiscard]] int get_i(); > + > +void f2(void) { > + get_s(); // expected-warning {{ignoring return value of function declared > with 'nodiscard' attribute}} > + get_i(); // expected-warning {{ignoring return value of function declared > with 'nodiscard' attribute}} > + get_e(); // expected-warning {{ignoring return value of function declared > with 'nodiscard' attribute}} > + > + // Okay, warnings are not encouraged > + (void)get_s(); > + (void)get_i(); > + (void)get_e(); > +} > + > +struct [[nodiscard]] error_info{ > + int i; > +}; > + > +struct error_info enable_missile_safety_mode(void); > +void launch_missiles(void); > +void test_missiles(void) { > + enable_missile_safety_mode(); // expected-warning {{ignoring return value > of function declared with 'nodiscard'}} > + launch_missiles(); > +} > + > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits