From 90181d6180cdfe050dd0cff470499e26b3d61dd5 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Sat, 15 Feb 2014 18:53:57 +0000 Subject: [PATCH] [Sema] Fix assertion hit while trying to do constant evaluation for a dependent expression inside a GNU statement expression. rdar://16064952 llvm-svn: 201468 --- clang/lib/AST/ExprConstant.cpp | 2 ++ clang/test/SemaCXX/constant-expression.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 9f79064fd77d..b11e9e8a2725 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -8028,6 +8028,8 @@ static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) { /// an object can indirectly refer to subobjects which were initialized earlier. static bool EvaluateInPlace(APValue &Result, EvalInfo &Info, const LValue &This, const Expr *E, bool AllowNonLiteralTypes) { + if (E->isTypeDependent() || E->isValueDependent()) + return false; if (!AllowNonLiteralTypes && !CheckLiteralType(Info, E, &This)) return false; diff --git a/clang/test/SemaCXX/constant-expression.cpp b/clang/test/SemaCXX/constant-expression.cpp index 2b39de68906e..e01acdd46f93 100644 --- a/clang/test/SemaCXX/constant-expression.cpp +++ b/clang/test/SemaCXX/constant-expression.cpp @@ -133,3 +133,11 @@ namespace test4 { // equivalent to "const int x = 42;" as per C++03 8.5/p13. typedef A Ai; // ok } + +// rdar://16064952 +namespace rdar16064952 { + template < typename T > void fn1() { + T b; + unsigned w = ({int a = b.val[sizeof(0)]; 0; }); // expected-warning {{use of GNU statement expression extension}} + } +}