From: Douglas Gregor Date: Wed, 13 Oct 2010 17:22:14 +0000 (+0000) Subject: Fix a silly bug in the suppression of non-error diagnostics in a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b535041ee33c5eff255832bc5541c8d52aae8254;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116411 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index e2850d9f04..55bda36e38 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/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/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 6430b7ec1c..102086b69d 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/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/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 1b3572a649..042f605cf0 100644 --- a/lib/Sema/Sema.cpp +++ b/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/test/SemaTemplate/temp_arg_nontype.cpp b/test/SemaTemplate/temp_arg_nontype.cpp index fffd1dd168..48c1289c85 100644 --- a/test/SemaTemplate/temp_arg_nontype.cpp +++ b/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'}} +}