aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2013-01-22 17:00:09 +0000
committerNico Weber <nicolasweber@gmx.de>2013-01-22 17:00:09 +0000
commitbbe1394c9602ab9a939d9b17199d5f538cac9d0c (patch)
tree367163eaed100fc4cc295f02319042dcd8e3597c
parent6029d4f3aeb711000bb9c07a6ec806248ca141bf (diff)
downloadllvm-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.cpp4
-rw-r--r--clang/test/SemaCXX/sourceranges.cpp5
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;