Re: r369829 - PR40674: fix assertion failure if a structured binding declaration has a

2019-08-26 Thread Hans Wennborg via cfe-commits
Merged to release_90 in r369921.

On Sat, Aug 24, 2019 at 3:22 AM Richard Smith via cfe-commits
 wrote:
>
> Author: rsmith
> Date: Fri Aug 23 18:23:57 2019
> New Revision: 369829
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369829=rev
> Log:
> PR40674: fix assertion failure if a structured binding declaration has a
> tuple-like decomposition that produces value-dependent reference
> bindings.
>
> Modified:
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=369829=369828=369829=diff
> ==
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Aug 23 18:23:57 2019
> @@ -1225,7 +1225,8 @@ static bool checkTupleLikeDecomposition(
>  if (E.isInvalid())
>return true;
>  RefVD->setInit(E.get());
> -RefVD->checkInitIsICE();
> +if (!E.get()->isValueDependent())
> +  RefVD->checkInitIsICE();
>
>  E = S.BuildDeclarationNameExpr(CXXScopeSpec(),
> DeclarationNameInfo(B->getDeclName(), 
> Loc),
>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp?rev=369829=369828=369829=diff
> ==
> --- cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp Fri Aug 23 18:23:57 2019
> @@ -127,7 +127,7 @@ void referenced_type() {
>using ConstInt3 = decltype(bcr2);
>  }
>
> -struct C { template int get(); };
> +struct C { template int get() const; };
>  template<> struct std::tuple_size { static const int value = 1; };
>  template<> struct std::tuple_element<0, C> { typedef int type; };
>
> @@ -138,6 +138,12 @@ int member_get() {
>return c;
>  }
>
> +constexpr C c = C();
> +template void dependent_binding_PR40674() {
> +  const auto &[c] = *p;
> +  (void)c;
> +}
> +
>  struct D {
>// FIXME: Emit a note here explaining why this was ignored.
>template struct get {};
>
>
> ___
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r369829 - PR40674: fix assertion failure if a structured binding declaration has a

2019-08-23 Thread Richard Smith via cfe-commits
Author: rsmith
Date: Fri Aug 23 18:23:57 2019
New Revision: 369829

URL: http://llvm.org/viewvc/llvm-project?rev=369829=rev
Log:
PR40674: fix assertion failure if a structured binding declaration has a
tuple-like decomposition that produces value-dependent reference
bindings.

Modified:
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=369829=369828=369829=diff
==
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Aug 23 18:23:57 2019
@@ -1225,7 +1225,8 @@ static bool checkTupleLikeDecomposition(
 if (E.isInvalid())
   return true;
 RefVD->setInit(E.get());
-RefVD->checkInitIsICE();
+if (!E.get()->isValueDependent())
+  RefVD->checkInitIsICE();
 
 E = S.BuildDeclarationNameExpr(CXXScopeSpec(),
DeclarationNameInfo(B->getDeclName(), Loc),

Modified: cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp?rev=369829=369828=369829=diff
==
--- cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp (original)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.decomp/p3.cpp Fri Aug 23 18:23:57 2019
@@ -127,7 +127,7 @@ void referenced_type() {
   using ConstInt3 = decltype(bcr2);
 }
 
-struct C { template int get(); };
+struct C { template int get() const; };
 template<> struct std::tuple_size { static const int value = 1; };
 template<> struct std::tuple_element<0, C> { typedef int type; };
 
@@ -138,6 +138,12 @@ int member_get() {
   return c;
 }
 
+constexpr C c = C();
+template void dependent_binding_PR40674() {
+  const auto &[c] = *p;
+  (void)c;
+}
+
 struct D {
   // FIXME: Emit a note here explaining why this was ignored.
   template struct get {};


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits