]> granicus.if.org Git - clang/commitdiff
Only allow streaming exactly type 'bool' to a DiagnosticBuilder, not anything
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 12 Mar 2014 23:36:42 +0000 (23:36 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 12 Mar 2014 23:36:42 +0000 (23:36 +0000)
that implicitly converts to 'bool' (such as pointers, and the first operand of
?:). Clean up issues found by this. Patch by Stephan Tolksdorf!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203735 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Diagnostic.h
lib/Driver/Driver.cpp
lib/Lex/ModuleMap.cpp
lib/Sema/SemaDeclCXX.cpp

index ab4f39fe56a7e166d5e25b82c7b3bc492fa73d21..6082ec8b1f3ad0edeffc66058bf2ec0cbc6e0b60 100644 (file)
@@ -1014,8 +1014,13 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, int I) {
   return DB;
 }
 
-inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
-                                           bool I) {
+// We use enable_if here to prevent that this overload is selected for
+// pointers or other arguments that are implicitly convertible to bool.
+template <typename T>
+inline
+typename std::enable_if<std::is_same<T, bool>::value,
+                        const DiagnosticBuilder &>::type
+operator<<(const DiagnosticBuilder &DB, T I) {
   DB.AddTaggedVal(I, DiagnosticsEngine::ak_sint);
   return DB;
 }
index fa7e16c41ecff25c5933f5bb7a2827bf44cdccd9..c318b60a93838ec1e75a12bd0cc6bf5555a8d3ca 100644 (file)
@@ -1192,13 +1192,13 @@ void Driver::BuildActions(const ToolChain &TC, DerivedArgList &Args,
         Diag(clang::diag::warn_drv_preprocessed_input_file_unused)
           << InputArg->getAsString(Args)
           << !!FinalPhaseArg
-          << FinalPhaseArg ? FinalPhaseArg->getOption().getName() : "";
+          << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : "");
       else
         Diag(clang::diag::warn_drv_input_file_unused)
           << InputArg->getAsString(Args)
           << getPhaseName(InitialPhase)
           << !!FinalPhaseArg
-          << FinalPhaseArg ? FinalPhaseArg->getOption().getName() : "";
+          << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : "");
       continue;
     }
 
index beb0bcbbd3f54f9a9c6d9fe7fb0657ec14e75510..d5e8af95fe6d299a52082ca3ca04388ed2fde5f9 100644 (file)
@@ -1282,7 +1282,8 @@ void ModuleMapParser::parseModuleDecl() {
       
       if (ActiveModule) {
         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
-          << Id[I].first << ActiveModule->getTopLevelModule();
+          << Id[I].first
+          << ActiveModule->getTopLevelModule()->getFullModuleName();
       } else {
         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
       }
index 027fd6f309a40eda6da4c3e55ae857f7113efe3e..c75bac5e8c6284b9f4bac649291d860d96a73318 100644 (file)
@@ -6564,8 +6564,7 @@ static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc,
     S.Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
       << FixItHint::CreateInsertion(KeywordLoc, "inline ");
   else
-    S.Diag(Loc, diag::err_inline_namespace_mismatch)
-      << IsInline;
+    S.Diag(Loc, diag::err_inline_namespace_mismatch) << *IsInline;
 
   S.Diag(PrevNS->getLocation(), diag::note_previous_definition);
   *IsInline = PrevNS->isInline();