diff options
author | Douglas Gregor <dgregor@apple.com> | 2013-01-29 01:26:43 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2013-01-29 01:26:43 +0000 |
commit | f727e1c6cc382c1b5fe23b38ba04df2d4a2f358a (patch) | |
tree | eb972d2a142c1db0fdffe954f47ca588824ddec1 | |
parent | 5cd532ca0bc1cb8110e24586d064f72332d8b767 (diff) |
Don't crash while printing APValues that are lvalues casted to a
decidedly non-reference, non-pointer type. Fixes <rdar://problem/13090123>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173747 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/APValue.cpp | 2 | ||||
-rw-r--r-- | test/CXX/expr/expr.const/p2-0x.cpp | 13 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/AST/APValue.cpp b/lib/AST/APValue.cpp index 1676b7d400..98e825b3ba 100644 --- a/lib/AST/APValue.cpp +++ b/lib/AST/APValue.cpp @@ -348,6 +348,8 @@ void APValue::printPretty(raw_ostream &Out, ASTContext &Ctx, QualType Ty) const{ bool IsReference = Ty->isReferenceType(); QualType InnerTy = IsReference ? Ty.getNonReferenceType() : Ty->getPointeeType(); + if (InnerTy.isNull()) + InnerTy = Ty; if (!hasLValuePath()) { // No lvalue path: just print the offset. diff --git a/test/CXX/expr/expr.const/p2-0x.cpp b/test/CXX/expr/expr.const/p2-0x.cpp index 9e6716d0b8..065a12b3f2 100644 --- a/test/CXX/expr/expr.const/p2-0x.cpp +++ b/test/CXX/expr/expr.const/p2-0x.cpp @@ -594,3 +594,16 @@ static const bool or_value = and_or<true>::or_value; static_assert(and_value == false, ""); static_assert(or_value == true, ""); + +namespace rdar13090123 { + typedef __INTPTR_TYPE__ intptr_t; + + constexpr intptr_t f(intptr_t x) { + return (((x) >> 21) * 8); // expected-note{{subexpression not valid in a constant expression}} + } + + extern "C" int foo; + + constexpr intptr_t i = f((intptr_t)&foo - 10); // expected-error{{constexpr variable 'i' must be initialized by a constant expression}} \ + // expected-note{{in call to 'f((char*)&foo + -10)'}} +} |