r349201 - Add extension to always default-initialize nullptr_t.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 14 14:40:41 PST 2018


Sorry, I was late with my review comment. I think this is the wrong way to
approach this problem. This does not "fix all situations where nullptr_t
would seem uninitialized", and it makes our AST representation lose source
fidelity.

On Fri, 14 Dec 2018 at 14:25, Erich Keane via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: erichkeane
> Date: Fri Dec 14 14:22:29 2018
> New Revision: 349201
>
> URL: http://llvm.org/viewvc/llvm-project?rev=349201&view=rev
> Log:
> Add extension to always default-initialize nullptr_t.
>
> Core issue 1013 suggests that having an uninitialied std::nullptr_t be
> UB is a bit foolish, since there is only a single valid value. This DR
> reports that DR616 fixes it, which does so by making lvalue-to-rvalue
> conversions from nullptr_t be equal to nullptr.
>
> However, just implementing that results in warnings/etc in many places.
> In order to fix all situations where nullptr_t would seem uninitialized,
> this patch instead (as an otherwise transparent extension) default
> initializes uninitialized VarDecls of nullptr_t.
>
> Differential Revision: https://reviews.llvm.org/D53713
>
> Change-Id: I84d72a9290054fa55341e8cbdac43c8e7f25b885
>
> Added:
>     cfe/trunk/test/SemaCXX/nullptr_t-init.cpp   (with props)
> Modified:
>     cfe/trunk/lib/Sema/SemaInit.cpp
>     cfe/trunk/test/Analysis/nullptr.cpp
>     cfe/trunk/test/SemaCXX/ast-print-crash.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=349201&r1=349200&r2=349201&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Dec 14 14:22:29 2018
> @@ -4881,6 +4881,13 @@ static void TryDefaultInitialization(Sem
>      return;
>    }
>
> +  // As an extension, and to fix Core issue 1013, zero initialize
> nullptr_t.
> +  // Since there is only 1 valid value of nullptr_t, we can just use that.
> +  if (DestType->isNullPtrType()) {
> +    Sequence.AddZeroInitializationStep(Entity.getType());
> +    return;
> +  }
> +
>    //     - otherwise, no initialization is performed.
>
>    //   If a program calls for the default initialization of an object of
>
> Modified: cfe/trunk/test/Analysis/nullptr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/nullptr.cpp?rev=349201&r1=349200&r2=349201&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/nullptr.cpp (original)
> +++ cfe/trunk/test/Analysis/nullptr.cpp Fri Dec 14 14:22:29 2018
> @@ -125,21 +125,16 @@ struct Type {
>  };
>
>  void shouldNotCrash() {
> -  decltype(nullptr) p; // expected-note{{'p' declared without an initial
> value}}
> -  if (getSymbol()) // expected-note   {{Assuming the condition is false}}
> -                   // expected-note at -1{{Taking false branch}}
> -                   // expected-note at -2{{Assuming the condition is false}}
> -                   // expected-note at -3{{Taking false branch}}
> -                   // expected-note at -4{{Assuming the condition is true}}
> -                   // expected-note at -5{{Taking true branch}}
> -    invokeF(p); // expected-warning{{1st function call argument is an
> uninitialized value}}
> -                // expected-note at -1{{1st function call argument is an
> uninitialized value}}
> +  decltype(nullptr) p; // expected-note{{'p' initialized to a null
> pointer value}}
>    if (getSymbol()) // expected-note   {{Assuming the condition is false}}
>                     // expected-note at -1{{Taking false branch}}
>                     // expected-note at -2{{Assuming the condition is true}}
>                     // expected-note at -3{{Taking true branch}}
> -    invokeF(nullptr); // expected-note   {{Calling 'invokeF'}}
> -                      // expected-note at -1{{Passing null pointer value
> via 1st parameter 'x'}}
> +    invokeF(p); // expected-note{{Passing null pointer value via 1st
> parameter 'x'}}
> +                // expected-note at -1{{Calling 'invokeF'}}
> +  if (getSymbol()) // expected-note   {{Assuming the condition is false}}
> +                   // expected-note at -1{{Taking false branch}}
> +    invokeF(nullptr);
>    if (getSymbol()) {  // expected-note  {{Assuming the condition is true}}
>                        // expected-note at -1{{Taking true branch}}
>      X *xx = Type().x; // expected-note   {{Null pointer value stored to
> field 'x'}}
>
> Modified: cfe/trunk/test/SemaCXX/ast-print-crash.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ast-print-crash.cpp?rev=349201&r1=349200&r2=349201&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/ast-print-crash.cpp (original)
> +++ cfe/trunk/test/SemaCXX/ast-print-crash.cpp Fri Dec 14 14:22:29 2018
> @@ -7,6 +7,6 @@
>
>  // CHECK:      struct {
>  // CHECK-NEXT: } dont_crash_on_syntax_error;
> -// CHECK-NEXT: decltype(nullptr) p;
> +// CHECK-NEXT: decltype(nullptr) p(/*implicit*/(decltype(nullptr))0);
>  struct {
>  } dont_crash_on_syntax_error /* missing ; */ decltype(nullptr) p;
>
> Added: cfe/trunk/test/SemaCXX/nullptr_t-init.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/nullptr_t-init.cpp?rev=349201&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/nullptr_t-init.cpp (added)
> +++ cfe/trunk/test/SemaCXX/nullptr_t-init.cpp Fri Dec 14 14:22:29 2018
> @@ -0,0 +1,10 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -ffreestanding
> -Wuninitialized %s
> +// expected-no-diagnostics
> +typedef decltype(nullptr) nullptr_t;
> +
> +// Ensure no 'uninitialized when used here' warnings (Wuninitialized),
> for
> +// nullptr_t always-initialized extension.
> +nullptr_t default_init() {
> +  nullptr_t a;
> +  return a;
> +}
>
> Propchange: cfe/trunk/test/SemaCXX/nullptr_t-init.cpp
>
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: cfe/trunk/test/SemaCXX/nullptr_t-init.cpp
>
> ------------------------------------------------------------------------------
>     svn:keywords = "Author Date Id Rev URL"
>
> Propchange: cfe/trunk/test/SemaCXX/nullptr_t-init.cpp
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181214/3c449a62/attachment-0001.html>


More information about the cfe-commits mailing list