This revision was automatically updated to reflect the committed changes. Closed by commit rL280330: [Sema] Don't diagnose an array type mismatch when the new or previous (authored by ahatanak).
Changed prior to commit: https://reviews.llvm.org/D24110?vs=69927&id=69935#toc Repository: rL LLVM https://reviews.llvm.org/D24110 Files: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/SemaTemplate/array-redeclaration.cpp Index: cfe/trunk/lib/Sema/SemaDecl.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp +++ cfe/trunk/lib/Sema/SemaDecl.cpp @@ -3367,11 +3367,11 @@ // 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)) Index: cfe/trunk/test/SemaTemplate/array-redeclaration.cpp =================================================================== --- cfe/trunk/test/SemaTemplate/array-redeclaration.cpp +++ cfe/trunk/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>(); +}
Index: cfe/trunk/lib/Sema/SemaDecl.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp +++ cfe/trunk/lib/Sema/SemaDecl.cpp @@ -3367,11 +3367,11 @@ // 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)) Index: cfe/trunk/test/SemaTemplate/array-redeclaration.cpp =================================================================== --- cfe/trunk/test/SemaTemplate/array-redeclaration.cpp +++ cfe/trunk/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>(); +}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits