From 3a344f9fc7a62ad0a8d26b2a1ccf5e4989720d0c Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 22 Jan 2013 17:00:09 +0000 Subject: [PATCH] Fix a bug in VarDecl::getSourceRange() for static member arrays with an element type with an implicit initializer expression. Patch from Will Wilson ! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173170 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Decl.cpp | 4 +++- test/SemaCXX/sourceranges.cpp | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index c053b6d17e..7a51814325 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1206,7 +1206,9 @@ void VarDecl::setStorageClass(StorageClass SC) { SourceRange VarDecl::getSourceRange() const { if (const Expr *Init = getInit()) { SourceLocation InitEnd = Init->getLocEnd(); - if (InitEnd.isValid()) + // If Init is implicit, ignore its source range and fallback on + // DeclaratorDecl::getSourceRange() to handle postfix elements. + if (InitEnd.isValid() && InitEnd != getLocation()) return SourceRange(getOuterLocStart(), InitEnd); } return DeclaratorDecl::getSourceRange(); diff --git a/test/SemaCXX/sourceranges.cpp b/test/SemaCXX/sourceranges.cpp index 0537aa20d5..1f25d5bce9 100644 --- a/test/SemaCXX/sourceranges.cpp +++ b/test/SemaCXX/sourceranges.cpp @@ -7,11 +7,14 @@ class P { }; namespace foo { -class A {}; +class A { public: A() {} }; enum B {}; typedef int C; } +// CHECK: VarDecl {{0x[0-9a-fA-F]+}} ImplicitConstrArray 'foo::A [2]' +static foo::A ImplicitConstrArray[2]; + int main() { // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} 'foo::A *' P p14 = new foo::A; -- 2.40.0