From: Vedant Kumar Date: Wed, 26 Apr 2017 15:40:21 +0000 (+0000) Subject: [Sema] Avoid using a null type pointer (fixes PR32750) X-Git-Tag: llvmorg-5.0.0-rc1~6635 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=25b6a7db2fa59eacca01da41b1c9521b0da74fc4;p=platform%2Fupstream%2Fllvm.git [Sema] Avoid using a null type pointer (fixes PR32750) isMicrosoftMissingTypename() uses a Type pointer without first checking that it's non-null. PR32750 reports a case where the pointer is in fact null. This patch adds in a defensive check and a regression test. Differential Revision: https://reviews.llvm.org/D32519 llvm-svn: 301420 --- diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index e7ea68e..f838c9a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -615,7 +615,7 @@ bool Sema::isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S) { CXXRecordDecl *RD = cast(CurContext); for (const auto &Base : RD->bases()) - if (Context.hasSameUnqualifiedType(QualType(Ty, 1), Base.getType())) + if (Ty && Context.hasSameUnqualifiedType(QualType(Ty, 1), Base.getType())) return true; return S->isFunctionPrototypeScope(); } diff --git a/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp index 96088a0..38949e1 100644 --- a/clang/test/SemaCXX/MicrosoftExtensions.cpp +++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp @@ -2,6 +2,7 @@ // RUN: %clang_cc1 -std=c++98 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fms-extensions -fexceptions -fcxx-exceptions -DTEST1 // RUN: %clang_cc1 -std=c++11 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fms-extensions -fexceptions -fcxx-exceptions -DTEST1 // RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fexceptions -fcxx-exceptions -DTEST2 +// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -std=c++11 -fms-compatibility -verify -DTEST3 #if TEST1 @@ -508,6 +509,13 @@ int S::fn() { return 0; } // expected-warning {{is missing exception specificati // Check that __unaligned is not recognized if MS extensions are not enabled typedef char __unaligned *aligned_type; // expected-error {{expected ';' after top level declarator}} +#elif TEST3 + +namespace PR32750 { +template struct A {}; +template struct B : A> { A::C::D d; }; // expected-error {{missing 'typename' prior to dependent type name 'A::C::D'}} +} + #else #error Unknown test mode