summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp4
-rw-r--r--clang/test/SemaTemplate/array-redeclaration.cpp33
2 files changed, 35 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 9df9c63cfdf..8b148af8cce 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -3367,11 +3367,11 @@ void Sema::MergeVarDeclTypes(VarDecl *New, VarDecl *Old,
// We are merging a variable declaration New into Old. If it has an array
// bound, and that bound differs from Old's bound, we should diagnose the
// mismatch.
- if (!NewArray->isIncompleteArrayType()) {
+ if (!NewArray->isIncompleteArrayType() && !NewArray->isDependentType()) {
for (VarDecl *PrevVD = Old->getMostRecentDecl(); PrevVD;
PrevVD = PrevVD->getPreviousDecl()) {
const ArrayType *PrevVDTy = Context.getAsArrayType(PrevVD->getType());
- if (PrevVDTy->isIncompleteArrayType())
+ if (PrevVDTy->isIncompleteArrayType() || PrevVDTy->isDependentType())
continue;
if (!Context.hasSameType(NewArray, PrevVDTy))
diff --git a/clang/test/SemaTemplate/array-redeclaration.cpp b/clang/test/SemaTemplate/array-redeclaration.cpp
new file mode 100644
index 00000000000..4edee701cfc
--- /dev/null
+++ b/clang/test/SemaTemplate/array-redeclaration.cpp
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+extern int array[1];
+
+template <typename>
+class C {
+ enum { D };
+public:
+ template <typename A> void foo1() {
+ extern int array[((int)C<A>::k > (int)D) ? 1 : -1];
+ }
+};
+
+template<>
+class C<int> {
+public:
+ const static int k = 2;
+};
+
+void foo2() {
+ C<char> c;
+ c.foo1<int>();
+}
+
+template<int n>
+void foo3() {
+ extern int array[n ? 1 : -1];
+}
+
+void foo4() {
+ foo3<5>();
+}
OpenPOWER on IntegriCloud