From 3e34cfe8b62d2bfae7a7ccb4d7ac7bec57b54ca5 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Thu, 1 Sep 2016 01:03:21 +0000 Subject: [PATCH] [Sema] Don't diagnose an array type mismatch when the new or previous declaration has a dependent type. This fixes a bug where clang errors out on a valid code. rdar://problem/28051467 Differential Revision: https://reviews.llvm.org/D24110 llvm-svn: 280330 --- clang/lib/Sema/SemaDecl.cpp | 4 +-- clang/test/SemaTemplate/array-redeclaration.cpp | 33 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 clang/test/SemaTemplate/array-redeclaration.cpp diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 9df9c63..8b148af 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 0000000..4edee70 --- /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 +class C { + enum { D }; +public: + template void foo1() { + extern int array[((int)C::k > (int)D) ? 1 : -1]; + } +}; + +template<> +class C { +public: + const static int k = 2; +}; + +void foo2() { + C c; + c.foo1(); +} + +template +void foo3() { + extern int array[n ? 1 : -1]; +} + +void foo4() { + foo3<5>(); +} -- 2.7.4