r367134 - [Sema] Fix -Wuninitialized for struct assignment from GNU C statement expression

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 26 13:46:44 PDT 2019


Merged to release_90 in r367150.

On Fri, Jul 26, 2019 at 10:28 AM Nathan Huckleberry via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: nathan-huckleberry
> Date: Fri Jul 26 10:29:35 2019
> New Revision: 367134
>
> URL: http://llvm.org/viewvc/llvm-project?rev=367134&view=rev
> Log:
> [Sema] Fix -Wuninitialized for struct assignment from GNU C statement expression
>
> Summary:
> Do not automatically report self references of structs in statement expression
> as warnings. Instead wait for uninitialized cfg analysis.
> https://bugs.llvm.org/show_bug.cgi?id=42604
>
> Reviewers: aaron.ballman, rsmith, nickdesaulniers
>
> Reviewed By: aaron.ballman, nickdesaulniers
>
> Subscribers: nathanchance, cfe-commits
>
> Tags: #clang
>
> Differential Revision: https://reviews.llvm.org/D64678
>
> Added:
>     cfe/trunk/test/Sema/warn-uninitialized-statement-expression.c
> Modified:
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=367134&r1=367133&r2=367134&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Jul 26 10:29:35 2019
> @@ -11257,9 +11257,12 @@ void Sema::AddInitializerToDecl(Decl *Re
>    // Check for self-references within variable initializers.
>    // Variables declared within a function/method body (except for references)
>    // are handled by a dataflow analysis.
> -  if (!VDecl->hasLocalStorage() || VDecl->getType()->isRecordType() ||
> -      VDecl->getType()->isReferenceType()) {
> -    CheckSelfReference(*this, RealDecl, Init, DirectInit);
> +  // This is undefined behavior in C++, but valid in C.
> +  if (getLangOpts().CPlusPlus) {
> +    if (!VDecl->hasLocalStorage() || VDecl->getType()->isRecordType() ||
> +        VDecl->getType()->isReferenceType()) {
> +      CheckSelfReference(*this, RealDecl, Init, DirectInit);
> +    }
>    }
>
>    // If the type changed, it means we had an incomplete type that was
>
> Added: cfe/trunk/test/Sema/warn-uninitialized-statement-expression.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-uninitialized-statement-expression.c?rev=367134&view=auto
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-uninitialized-statement-expression.c (added)
> +++ cfe/trunk/test/Sema/warn-uninitialized-statement-expression.c Fri Jul 26 10:29:35 2019
> @@ -0,0 +1,56 @@
> +// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -verify %s
> +
> +void init(int *);
> +
> +void foo(void) {
> +  int i = ({
> +    init(&i);
> +    i;
> +  });
> +}
> +
> +void foo_bad(void) {
> +  int i = ({
> +    int z = i; // expected-warning{{variable 'i' is uninitialized when used within its own initialization}}
> +    init(&i);
> +    i;
> +  });
> +}
> +
> +struct widget {
> +  int x, y;
> +};
> +void init2(struct widget *);
> +
> +void bar(void) {
> +  struct widget my_widget = ({
> +    init2(&my_widget);
> +    my_widget;
> +  });
> +  struct widget a = (init2(&a), a);
> +}
> +
> +void bar_bad(void) {
> +  struct widget my_widget = ({
> +    struct widget z = my_widget; // expected-warning{{variable 'my_widget' is uninitialized when used within its own initialization}}
> +    int x = my_widget.x;         //FIXME: There should be an uninitialized warning here
> +    init2(&my_widget);
> +    my_widget;
> +  });
> +}
> +
> +void baz(void) {
> +  struct widget a = ({
> +    struct widget b = ({
> +      b = a; // expected-warning{{variable 'a' is uninitialized when used within its own initialization}}
> +    });
> +    a;
> +  });
> +}
> +
> +void f(void) {
> +  struct widget *a = ({
> +    init2(a); // expected-warning{{variable 'a' is uninitialized when used within its own initialization}}
> +    a;
> +  });
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list