Hans, this should go into Clang 4.

On 23 January 2017 at 15:14, Richard Smith via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

> Author: rsmith
> Date: Mon Jan 23 17:14:23 2017
> New Revision: 292847
>
> URL: http://llvm.org/viewvc/llvm-project?rev=292847&view=rev
> Log:
> PR31692: Don't mark a declaration as invalid if we haven't necessarily
> emitted a (user-visible) error.
>
> Added:
>     cfe/trunk/test/SemaCXX/cxx11-default-member-initializers.cpp
> Modified:
>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaDeclCXX.cpp?rev=292847&r1=292846&r2=292847&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Jan 23 17:14:23 2017
> @@ -12383,9 +12383,9 @@ ExprResult Sema::BuildCXXDefaultInitExpr
>    Diag(Loc, diag::err_in_class_initializer_not_yet_parsed)
>        << OutermostClass << Field;
>    Diag(Field->getLocEnd(), diag::note_in_class_
> initializer_not_yet_parsed);
> -
> -  // Don't diagnose this again.
> -  Field->setInvalidDecl();
> +  // Recover by marking the field invalid, unless we're in a SFINAE
> context.
> +  if (!isSFINAEContext())
> +    Field->setInvalidDecl();
>    return ExprError();
>  }
>
>
> Added: cfe/trunk/test/SemaCXX/cxx11-default-member-initializers.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/cxx11-default-member-initializers.cpp?rev=292847&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/cxx11-default-member-initializers.cpp (added)
> +++ cfe/trunk/test/SemaCXX/cxx11-default-member-initializers.cpp Mon Jan
> 23 17:14:23 2017
> @@ -0,0 +1,14 @@
> +// RUN: %clang_cc1 -std=c++11 -verify %s -pedantic
> +
> +namespace PR31692 {
> +  struct A {
> +    struct X { int n = 0; } x;
> +    // Trigger construction of X() from a SFINAE context. This must not
> mark
> +    // any part of X as invalid.
> +    static_assert(!__is_constructible(X), "");
> +    // Check that X::n is not marked invalid.
> +    double &r = x.n; // expected-error {{non-const lvalue reference to
> type 'double' cannot bind to a value of unrelated type 'int'}}
> +  };
> +  // A::X can now be default-constructed.
> +  static_assert(__is_constructible(A::X), "");
> +}
>
>
> _______________________________________________
> 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

Reply via email to