r316026 - Enable support for the [[nodiscard]] attribute from WG14 N2050 when enabling double square bracket attributes in C code.

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 17 13:44:18 PDT 2017


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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list