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