From 77fb231f9e5c4320b1a6c1c35728f30175af2cf8 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 13 May 2019 07:51:29 +0000 Subject: [PATCH] PR41854: Don't assert when constant-evaluating a member function call on an invalid designator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360560 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ExprConstant.cpp | 3 +++ test/SemaCXX/constant-expression-cxx11.cpp | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 2b585edaf2..adc82bfe0b 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -4537,6 +4537,9 @@ const AccessKinds CheckMemberCallThisPointerHandler::AccessKind; /// either within its lifetime or in its period of construction or destruction. static bool checkMemberCallThisPointer(EvalInfo &Info, const Expr *E, const LValue &This) { + if (This.Designator.Invalid) + return false; + CompleteObject Obj = findCompleteObject(Info, E, AK_MemberCall, This, QualType()); diff --git a/test/SemaCXX/constant-expression-cxx11.cpp b/test/SemaCXX/constant-expression-cxx11.cpp index c136b4d269..46a77e1814 100644 --- a/test/SemaCXX/constant-expression-cxx11.cpp +++ b/test/SemaCXX/constant-expression-cxx11.cpp @@ -2284,3 +2284,11 @@ namespace PR40430 { }; static_assert(S().foo() == 'f', ""); } + +namespace PR41854 { + struct e { operator int(); }; + struct f { e c; }; + int a; + f &d = reinterpret_cast(a); + unsigned b = d.c; +} -- 2.40.0