diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-09-09 01:45:28 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-09-09 01:45:28 +0000 |
| commit | 822514fe399df13955e5490a7085cebdcf5291e0 (patch) | |
| tree | c8999f710753897c3f679b5f6d3a4225c60af445 | |
| parent | 49adbf42b1baa422769e0e45f932fe355d932bba (diff) | |
| download | bcm5719-llvm-822514fe399df13955e5490a7085cebdcf5291e0.tar.gz bcm5719-llvm-822514fe399df13955e5490a7085cebdcf5291e0.zip | |
Allow a declaration of an array to complete a prior, incomplete
declaration of that array in C++.
llvm-svn: 81309
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 7 | ||||
| -rw-r--r-- | clang/test/SemaCXX/static-array-member.cpp | 18 |
2 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6f04f7b162f..a72ca1d01fa 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -980,6 +980,13 @@ void Sema::MergeVarDecl(VarDecl *New, Decl *OldD) { if (getLangOptions().CPlusPlus) { if (Context.hasSameType(New->getType(), Old->getType())) MergedT = New->getType(); + // C++ [basic.types]p7: + // [...] The declared type of an array object might be an array of + // unknown size and therefore be incomplete at one point in a + // translation unit and complete later on; [...] + else if (Old->getType()->isIncompleteArrayType() && + New->getType()->isArrayType()) + MergedT = New->getType(); } else { MergedT = Context.mergeTypes(New->getType(), Old->getType()); } diff --git a/clang/test/SemaCXX/static-array-member.cpp b/clang/test/SemaCXX/static-array-member.cpp new file mode 100644 index 00000000000..dac70cd2eab --- /dev/null +++ b/clang/test/SemaCXX/static-array-member.cpp @@ -0,0 +1,18 @@ +// RUN: clang-cc -fsyntax-only %s + +struct X0 { + static int array[]; + + int x; + int y; +}; + +int X0::array[sizeof(X0) * 2]; + +template<typename T, int N> +struct X1 { + static T array[]; +}; + +template<typename T, int N> +T X1<T, N>::array[N]; |

