diff options
author | Reid Kleckner <rnk@google.com> | 2019-09-12 18:26:34 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-09-12 18:26:34 +0000 |
commit | b6a8152b8bf7dc7b56e2953575037281af3d9133 (patch) | |
tree | 0bcc09b3be864b224feb5603be3aa22d9a63ad96 /clang/lib/Sema/SemaTemplate.cpp | |
parent | 18f5204db4a9d5df3cb89833de4805a78f5034ee (diff) | |
download | bcm5719-llvm-b6a8152b8bf7dc7b56e2953575037281af3d9133.tar.gz bcm5719-llvm-b6a8152b8bf7dc7b56e2953575037281af3d9133.zip |
[MS] Warn when shadowing template parameters under -fms-compatibility
Summary:
C++ does not allow shadowing template parameters, but previously we
allowed it under -fms-extensions. Now this behavior is controlled by
-fms-compatibility, and we emit a -Wmicrosoft-template warning when it
happens.
Fixes PR43265
Reviewers: thakis, hans
Subscribers: amccarth, rsmith, STL_MSFT, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D67463
llvm-svn: 371753
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 001e433ad6a..91466fa904b 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -849,15 +849,14 @@ bool Sema::DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, void Sema::DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl) { assert(PrevDecl->isTemplateParameter() && "Not a template parameter"); - // Microsoft Visual C++ permits template parameters to be shadowed. - if (getLangOpts().MicrosoftExt) - return; - // C++ [temp.local]p4: // A template-parameter shall not be redeclared within its // scope (including nested scopes). - Diag(Loc, diag::err_template_param_shadow) - << cast<NamedDecl>(PrevDecl)->getDeclName(); + // + // Make this a warning when MSVC compatibility is requested. + unsigned DiagId = getLangOpts().MSVCCompat ? diag::ext_template_param_shadow + : diag::err_template_param_shadow; + Diag(Loc, DiagId) << cast<NamedDecl>(PrevDecl)->getDeclName(); Diag(PrevDecl->getLocation(), diag::note_template_param_here); } |