diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2013-01-22 17:00:09 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2013-01-22 17:00:09 +0000 |
| commit | bbe1394c9602ab9a939d9b17199d5f538cac9d0c (patch) | |
| tree | 367163eaed100fc4cc295f02319042dcd8e3597c | |
| parent | 6029d4f3aeb711000bb9c07a6ec806248ca141bf (diff) | |
| download | llvm-bbe1394c9602ab9a939d9b17199d5f538cac9d0c.zip llvm-bbe1394c9602ab9a939d9b17199d5f538cac9d0c.tar.gz llvm-bbe1394c9602ab9a939d9b17199d5f538cac9d0c.tar.bz2 | |
Fix a bug in VarDecl::getSourceRange() for static member arrays with an element
type with an implicit initializer expression.
Patch from Will Wilson <will@indefiant.com>!
llvm-svn: 173170
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/sourceranges.cpp | 5 |
2 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index c053b6d..7a51814 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/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/clang/test/SemaCXX/sourceranges.cpp b/clang/test/SemaCXX/sourceranges.cpp index 0537aa2..1f25d5b 100644 --- a/clang/test/SemaCXX/sourceranges.cpp +++ b/clang/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]+}} <line:16:1, col:36> ImplicitConstrArray 'foo::A [2]' +static foo::A ImplicitConstrArray[2]; + int main() { // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::A *' P<foo::A> p14 = new foo::A; |
