From b39215942ee1f585b49380f2bb387df9ebc9d2b7 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 13 Oct 2010 17:22:14 +0000 Subject: [PATCH] Fix a silly bug in the suppression of non-error diagnostics in a SFINAE context, where we weren't getting the right diagnostic argument count. I blame DiagnosticBuilder's weirdness. Fixes PR8372. llvm-svn: 116411 --- clang/include/clang/Basic/Diagnostic.h | 3 +++ clang/lib/Basic/Diagnostic.cpp | 10 +++++++--- clang/lib/Sema/Sema.cpp | 2 ++ clang/test/SemaTemplate/temp_arg_nontype.cpp | 5 +++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index e2850d9f0485..55bda36e38ee 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -669,6 +669,9 @@ class DiagnosticBuilder { : DiagObj(diagObj), NumArgs(0), NumRanges(0), NumFixItHints(0) {} friend class PartialDiagnostic; + +protected: + void FlushCounts(); public: /// Copy constructor. When copied, this "takes" the diagnostic info from the diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 6430b7ec1c82..102086b69d1c 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -625,6 +625,12 @@ bool Diagnostic::ProcessDiag() { return true; } +void DiagnosticBuilder::FlushCounts() { + DiagObj->NumDiagArgs = NumArgs; + DiagObj->NumDiagRanges = NumRanges; + DiagObj->NumFixItHints = NumFixItHints; +} + bool DiagnosticBuilder::Emit() { // If DiagObj is null, then its soul was stolen by the copy ctor // or the user called Emit(). @@ -632,9 +638,7 @@ bool DiagnosticBuilder::Emit() { // When emitting diagnostics, we set the final argument count into // the Diagnostic object. - DiagObj->NumDiagArgs = NumArgs; - DiagObj->NumDiagRanges = NumRanges; - DiagObj->NumFixItHints = NumFixItHints; + FlushCounts(); // Process the diagnostic, sending the accumulated information to the // DiagnosticClient. diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 1b3572a6498b..042f605cf0cd 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -455,7 +455,9 @@ Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() { case Diagnostic::SFINAE_Suppress: // Make a copy of this suppressed diagnostic and store it with the // template-deduction information; + FlushCounts(); DiagnosticInfo DiagInfo(&SemaRef.Diags); + Info->addSuppressedDiagnostic(DiagInfo.getLocation(), PartialDiagnostic(DiagInfo, SemaRef.Context.getDiagAllocator())); diff --git a/clang/test/SemaTemplate/temp_arg_nontype.cpp b/clang/test/SemaTemplate/temp_arg_nontype.cpp index fffd1dd1684f..48c1289c855f 100644 --- a/clang/test/SemaTemplate/temp_arg_nontype.cpp +++ b/clang/test/SemaTemplate/temp_arg_nontype.cpp @@ -243,3 +243,8 @@ namespace test8 { B<&c03> b03; } } + +namespace PR8372 { + template void foo() { } // expected-note{{template parameter is declared here}} + void bar() { foo <0x80000000> (); } // expected-warning{{non-type template argument value '2147483648' truncated to '-2147483648' for template parameter of type 'int'}} +}