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 | 3dab34a7cb5e2ad9c2311fc44b3d3b7ebb540992 (patch) | |
tree | daae3f99f8e3c33c25c934b6747b5ae831117e4c | |
parent | 3b6afbb99a1c44b4076f8e15fb7311405941b306 (diff) |
Allow a declaration of an array to complete a prior, incomplete
declaration of that array in C++.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81309 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 7 | ||||
-rw-r--r-- | test/SemaCXX/static-array-member.cpp | 18 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 6f04f7b162..a72ca1d01f 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/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/test/SemaCXX/static-array-member.cpp b/test/SemaCXX/static-array-member.cpp new file mode 100644 index 0000000000..dac70cd2ea --- /dev/null +++ b/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]; |