]> granicus.if.org Git - clang/commitdiff
Extended VerifyDiagnosticConsumer to also verify source file for diagnostic.
authorAndy Gibbs <andyg1001@hotmail.co.uk>
Wed, 17 Apr 2013 08:06:46 +0000 (08:06 +0000)
committerAndy Gibbs <andyg1001@hotmail.co.uk>
Wed, 17 Apr 2013 08:06:46 +0000 (08:06 +0000)
VerifyDiagnosticConsumer previously would not check that the diagnostic and
its matching directive referenced the same source file.  Common practice was
to create directives that referenced other files but only by line number,
and this led to problems such as when the file containing the directive
didn't have enough lines to match the location of the diagnostic in the
other file, leading to bizarre file formatting and other oddities.

This patch causes VerifyDiagnosticConsumer to match source files as well as
line numbers.  Therefore, a new syntax is made available for directives, for
example:

// expected-error@file:line {{diagnostic message}}

This extends the @line feature where "file" is the file where the diagnostic
is generated.  The @line syntax is still available and uses the current file
for the diagnostic.  "file" can be specified either as a relative or absolute
path - although the latter has less usefulness, I think!  The #include search
paths will be used to locate the file and if it is not found an error will be
generated.

The new check is not optional: if the directive is in a different file to the
diagnostic, the file must be specified.  Therefore, a number of test-cases
have been updated with regard to this.

This closes out PR15613.

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

37 files changed:
include/clang/Basic/DiagnosticFrontendKinds.td
include/clang/Frontend/VerifyDiagnosticConsumer.h
lib/Frontend/VerifyDiagnosticConsumer.cpp
test/ASTMerge/function.c
test/Analysis/diagnostics/explicit-suppression.cpp
test/Frontend/verify.c
test/Misc/warn-in-system-header.c
test/Modules/auto-module-import.m
test/Modules/decldef.m
test/Modules/decldef.mm
test/Modules/diamond-pch.c
test/Modules/diamond.c
test/Modules/linkage-merge.cpp
test/Modules/linkage-merge.m
test/Modules/lookup.cpp
test/Modules/lookup.m
test/Modules/macros.c
test/Modules/method_pool.m
test/Modules/module-private.cpp
test/Modules/namespaces.cpp
test/Modules/normal-module-map.cpp
test/Modules/objc-categories.m
test/Modules/on-demand-build.m
test/Modules/redecl-merge.m
test/Modules/subframeworks.m
test/PCH/cxx-using.cpp
test/PCH/cxx11-statement-attributes.cpp
test/PCH/functions.c
test/PCH/method_pool.m
test/PCH/nonvisible-external-defs.c
test/PCH/reloc.c
test/PCH/tentative-defs.c
test/PCH/typo.cpp
test/PCH/typo.m
test/Sema/pragma-arc-cf-code-audited.c
test/SemaObjC/arc-system-header.m
test/SemaObjCXX/arc-system-header.mm

index 111622e0fe9e2dd2bbc55a8af9fc5cf7fcf4841d..f05fb9be82ccc5c006119fed7afeeb31e1d4c00d 100644 (file)
@@ -67,6 +67,8 @@ def warn_fe_serialized_diag_failure : Warning<
 
 def err_verify_missing_line : Error<
     "missing or invalid line number following '@' in expected %0">;
+def err_verify_missing_file : Error<
+    "file '%0' could not be located in expected %1">;
 def err_verify_invalid_range : Error<
     "invalid range following '-' in expected %0">;
 def err_verify_missing_start : Error<
index 06a3b24f3a3f434dfa0a2f5bccb3b85844f8e7ab..9cd73ba9614390db947900ebcd9c83b046728b6b 100644 (file)
@@ -61,6 +61,18 @@ class FileEntry;
 /// The line number may be absolute (as above), or relative to the current
 /// line by prefixing the number with either '+' or '-'.
 ///
+/// If the diagnostic is generated in a separate file, for example in a shared
+/// header file, it may be beneficial to be able to declare the file in which
+/// the diagnostic will appear, rather than placing the expected-* directive in
+/// the actual file itself.  This can be done using the following syntax:
+///
+/// \code
+///   // expected-error@path/include.h:15 {{error message}}
+/// \endcode
+///
+/// The path can be absolute or relative and the same search paths will be used
+/// as for #include directives.
+///
 /// The simple syntax above allows each specification to match exactly one
 /// error.  You can use the extended syntax to customize this. The extended
 /// syntax is "expected-<type> <n> {{diag text}}", where \<type> is one of
index 82f6e916e58d91e388b414610bc1065485c61577..4f05aef94f3c29d8e57a7dd599e4addf191f7127 100644 (file)
@@ -278,8 +278,10 @@ private:
 ///
 /// Returns true if any valid directives were found.
 static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM,
-                           SourceLocation Pos, DiagnosticsEngine &Diags,
+                           Preprocessor *PP, SourceLocation Pos,
                            VerifyDiagnosticConsumer::DirectiveStatus &Status) {
+  DiagnosticsEngine &Diags = PP ? PP->getDiagnostics() : SM.getDiagnostics();
+
   // A single comment may contain multiple directives.
   bool FoundDirective = false;
   for (ParseHelper PH(S); !PH.Done();) {
@@ -353,10 +355,30 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM,
           else ExpectedLine -= Line;
           ExpectedLoc = SM.translateLineCol(SM.getFileID(Pos), ExpectedLine, 1);
         }
-      } else {
+      } else if (PH.Next(Line)) {
         // Absolute line number.
-        if (PH.Next(Line) && Line > 0)
+        if (Line > 0)
           ExpectedLoc = SM.translateLineCol(SM.getFileID(Pos), Line, 1);
+      } else if (PP && PH.Search(":")) {
+        // Specific source file.
+        StringRef Filename(PH.C, PH.P-PH.C);
+        PH.Advance();
+
+        // Lookup file via Preprocessor, like a #include.
+        const DirectoryLookup *CurDir;
+        const FileEntry *FE = PP->LookupFile(Filename, false, NULL, CurDir,
+                                             NULL, NULL, 0);
+        if (!FE) {
+          Diags.Report(Pos.getLocWithOffset(PH.C-PH.Begin),
+                       diag::err_verify_missing_file) << Filename << KindStr;
+          continue;
+        }
+
+        if (SM.translateFile(FE).isInvalid())
+          SM.createFileID(FE, Pos, SrcMgr::C_User);
+
+        if (PH.Next(Line) && Line > 0)
+          ExpectedLoc = SM.translateFileLineCol(FE, Line, 1);
       }
 
       if (ExpectedLoc.isInvalid()) {
@@ -465,7 +487,7 @@ bool VerifyDiagnosticConsumer::HandleComment(Preprocessor &PP,
   // Fold any "\<EOL>" sequences
   size_t loc = C.find('\\');
   if (loc == StringRef::npos) {
-    ParseDirective(C, &ED, SM, CommentBegin, PP.getDiagnostics(), Status);
+    ParseDirective(C, &ED, SM, &PP, CommentBegin, Status);
     return false;
   }
 
@@ -495,7 +517,7 @@ bool VerifyDiagnosticConsumer::HandleComment(Preprocessor &PP,
   }
 
   if (!C2.empty())
-    ParseDirective(C2, &ED, SM, CommentBegin, PP.getDiagnostics(), Status);
+    ParseDirective(C2, &ED, SM, &PP, CommentBegin, Status);
   return false;
 }
 
@@ -530,8 +552,7 @@ static bool findDirectives(SourceManager &SM, FileID FID,
     if (Comment.empty()) continue;
 
     // Find first directive.
-    if (ParseDirective(Comment, 0, SM, Tok.getLocation(),
-                       SM.getDiagnostics(), Status))
+    if (ParseDirective(Comment, 0, SM, 0, Tok.getLocation(), Status))
       return true;
   }
   return false;
@@ -551,8 +572,13 @@ static unsigned PrintUnexpected(DiagnosticsEngine &Diags, SourceManager *SourceM
   for (const_diag_iterator I = diag_begin, E = diag_end; I != E; ++I) {
     if (I->first.isInvalid() || !SourceMgr)
       OS << "\n  (frontend)";
-    else
-      OS << "\n  Line " << SourceMgr->getPresumedLineNumber(I->first);
+    else {
+      OS << "\n ";
+      if (const FileEntry *File = SourceMgr->getFileEntryForID(
+                                                SourceMgr->getFileID(I->first)))
+        OS << " File " << File->getName();
+      OS << " Line " << SourceMgr->getPresumedLineNumber(I->first);
+    }
     OS << ": " << I->second;
   }
 
@@ -572,11 +598,12 @@ static unsigned PrintExpected(DiagnosticsEngine &Diags, SourceManager &SourceMgr
   llvm::raw_svector_ostream OS(Fmt);
   for (DirectiveList::iterator I = DL.begin(), E = DL.end(); I != E; ++I) {
     Directive &D = **I;
-    OS << "\n  Line " << SourceMgr.getPresumedLineNumber(D.DiagnosticLoc);
+    OS << "\n  File " << SourceMgr.getFilename(D.DiagnosticLoc)
+          << " Line " << SourceMgr.getPresumedLineNumber(D.DiagnosticLoc);
     if (D.DirectiveLoc != D.DiagnosticLoc)
       OS << " (directive at "
-         << SourceMgr.getFilename(D.DirectiveLoc) << ":"
-         << SourceMgr.getPresumedLineNumber(D.DirectiveLoc) << ")";
+         << SourceMgr.getFilename(D.DirectiveLoc) << ':'
+         << SourceMgr.getPresumedLineNumber(D.DirectiveLoc) << ')';
     OS << ": " << D.Text;
   }
 
@@ -585,6 +612,22 @@ static unsigned PrintExpected(DiagnosticsEngine &Diags, SourceManager &SourceMgr
   return DL.size();
 }
 
+/// \brief Determine whether two source locations come from the same file.
+static bool IsFromSameFile(SourceManager &SM, SourceLocation DirectiveLoc,
+                           SourceLocation DiagnosticLoc) {
+  while (DiagnosticLoc.isMacroID())
+    DiagnosticLoc = SM.getImmediateMacroCallerLoc(DiagnosticLoc);
+
+  if (SM.isFromSameFile(DirectiveLoc, DiagnosticLoc))
+    return true;
+
+  const FileEntry *DiagFile = SM.getFileEntryForID(SM.getFileID(DiagnosticLoc));
+  if (!DiagFile && SM.isFromMainFile(DirectiveLoc))
+    return true;
+
+  return (DiagFile == SM.getFileEntryForID(SM.getFileID(DirectiveLoc)));
+}
+
 /// CheckLists - Compare expected to seen diagnostic lists and return the
 /// the difference between them.
 ///
@@ -607,6 +650,9 @@ static unsigned CheckLists(DiagnosticsEngine &Diags, SourceManager &SourceMgr,
         if (LineNo1 != LineNo2)
           continue;
 
+        if (!IsFromSameFile(SourceMgr, D.DiagnosticLoc, II->first))
+          continue;
+
         const std::string &RightText = II->second;
         if (D.match(RightText))
           break;
index 320bca2a36f1a024123ef6472d4743b6b563528e..8a8a0305145290601a67966ed17f3b69efe19a2b 100644 (file)
@@ -9,7 +9,7 @@
 // CHECK: function1.c:4:6: note: declared here with type 'void (void)'
 // CHECK: 2 errors generated
 
-// expected-error@3 {{external function 'f1' declared with incompatible types}}
-// expected-note@2 {{declared here}}
-// expected-error@5 {{external function 'f3' declared with incompatible types}}
-// expected-note@4 {{declared here}}
+// expected-error@Inputs/function2.c:3 {{external function 'f1' declared with incompatible types}}
+// expected-note@Inputs/function1.c:2 {{declared here}}
+// expected-error@Inputs/function2.c:5 {{external function 'f3' declared with incompatible types}}
+// expected-note@Inputs/function1.c:4 {{declared here}}
index 79afeed6c56d1dcef1797eae385bf950eaa93e3a..57d2d16f89cc2a58dc49b08bdf879837887be525 100644 (file)
@@ -12,69 +12,6 @@ void clang_analyzer_eval(bool);
 void testCopyNull(int *I, int *E) {
   std::copy(I, E, (int *)0);
 #ifndef SUPPRESSED
-  // This line number comes from system-header-simulator-cxx.h.
-  // expected-warning@79 {{Dereference of null pointer}}
+  // expected-warning@../Inputs/system-header-simulator-cxx.h:80 {{Dereference of null pointer}}
 #endif
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// PR15613: expected-* can't refer to diagnostics in other source files.
-// The current implementation only matches line numbers, but has an upper limit
-// of the number of lines in the main source file.
index 062e6bd8618f924dd18ff0777640ece5c3cd92b3..3d71e04980c56a6f7f2f637574a7c8d3a591d18a 100644 (file)
@@ -124,3 +124,19 @@ unexpected b; // expected-error@33 1-1 {{unknown type}}
 // CHECK7-NEXT:   Line 2: 2
 // CHECK7-NEXT: 2 errors generated.
 #endif
+
+#ifdef TEST8
+// RUN: %clang_cc1 -DTEST8 -verify %s 2>&1 | FileCheck -check-prefix=CHECK8 %s
+
+// expected-warning@nonexistant-file:1 {{ }}
+// expected-error@-1 {{file 'nonexistant-file' could not be located}}
+
+// expected-warning@verify-directive.h: {{ }}
+// expected-error@-1 {{missing or invalid line number}}
+
+// expected-warning@verify-directive.h:1 {{diagnostic}}
+
+//      CHECK8: error: 'warning' diagnostics expected but not seen:
+// CHECK8-NEXT:   File {{.*}}verify-directive.h Line 1 (directive at {{.*}}verify.c:137): diagnostic
+// CHECK8-NEXT: 1 error generated.
+#endif
index 6e0237d0dcdc2e9e23744951f5ee8d1a38ee7c05..132f083af7ba72ea431a4a457aa950b0de742f3c 100644 (file)
@@ -1,4 +1,4 @@
 // RUN: %clang_cc1 -isystem %S %s -fsyntax-only -verify 
 
 #include <warn-in-system-header.h>
-// expected-warning {{the cake is a lie}}
+// expected-warning@warn-in-system-header.h:4 {{the cake is a lie}}
index 4bd3c5279ceb17e562a83ef9b143ea463492e89d..7351828182037f05095290b16b4f03d777e5c692 100644 (file)
@@ -1,10 +1,10 @@
-// other file: expected-note{{'no_umbrella_A_private' declared here}}
-
 // RUN: rm -rf %t
 // RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify
 
 #include <DependsOnModule/DependsOnModule.h> // expected-warning{{treating #include as an import of module 'DependsOnModule'}}
 
+// expected-note@Inputs/NoUmbrella.framework/PrivateHeaders/A_Private.h:1{{'no_umbrella_A_private' declared here}}
+
 #ifdef MODULE_H_MACRO
 #  error MODULE_H_MACRO should have been hidden
 #endif
index 7fb8a61386e6e5fbf6e0e78688170d4c705dad4d..7ed82b57e9c632c7632eb445d22e870946cee51e 100644 (file)
@@ -1,8 +1,7 @@
 // RUN: rm -rf %t
 // RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify
 
-
-// In other file: expected-note {{previous definition is here}}
+// expected-note@Inputs/def.h:5 {{previous definition is here}}
 
 @class Def;
 Def *def;
index 732c2a27e235da558d7d96ecb2a479148584c6b0..593f53b2c6cf2638cfe837ad3ee1f2a5fba70e90 100644 (file)
@@ -1,8 +1,7 @@
 // RUN: rm -rf %t
 // RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify
 
-
-// In other file: expected-note {{previous definition is here}}
+// expected-note@Inputs/def.h:5 {{previous definition is here}}
 
 @class Def;
 Def *def;
index 079f6afa9c797929fa42884af307ab65adc0e237..e7ad02dbe48aa8190fe4da63b160c5eea7226995 100644 (file)
@@ -1,14 +1,20 @@
-
-
-
-// in diamond-bottom.h: expected-note{{passing argument to parameter 'x' here}}
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_top %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_left %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_right %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_bottom %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-pch -fmodules-cache-path=%t -o %t.pch %S/Inputs/diamond.h
+// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -include-pch %t.pch %s -verify
+// FIXME: When we have a syntax for modules in C, use that.
 
 void test_diamond(int i, float f, double d, char c) {
   top(&i);
   left(&f);
   right(&d);
   bottom(&c);
-  bottom(&d); // expected-warning{{incompatible pointer types passing 'double *' to parameter of type 'char *'}}
+  bottom(&d);
+  // expected-warning@-1{{incompatible pointer types passing 'double *' to parameter of type 'char *'}}
+  // expected-note@Inputs/diamond_bottom.h:4{{passing argument to parameter 'x' here}}
 
   // Names in multiple places in the diamond.
   top_left(&c);
@@ -17,12 +23,3 @@ void test_diamond(int i, float f, double d, char c) {
   struct left_and_right lr;
   lr.left = 17;
 }
-
-// RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_top %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_left %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_right %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_bottom %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-pch -fmodules-cache-path=%t -o %t.pch %S/Inputs/diamond.h
-// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -include-pch %t.pch %s -verify
-// FIXME: When we have a syntax for modules in C, use that.
index 0bac1b7596a4899be8d7686e8e241e2e23eef42e..89d5bc0dda5f6c901e8e51ced2cda8f3c2044c79 100644 (file)
@@ -1,7 +1,10 @@
-
-
-
-// in diamond-bottom.h: expected-note{{passing argument to parameter 'x' here}}
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_top %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_left %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_right %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_bottom %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t %s -verify
+// FIXME: When we have a syntax for modules in C, use that.
 
 @import diamond_bottom;
 
@@ -10,7 +13,9 @@ void test_diamond(int i, float f, double d, char c) {
   left(&f);
   right(&d);
   bottom(&c);
-  bottom(&d); // expected-warning{{incompatible pointer types passing 'double *' to parameter of type 'char *'}}
+  bottom(&d);
+  // expected-warning@-1{{incompatible pointer types passing 'double *' to parameter of type 'char *'}}
+  // expected-note@Inputs/diamond_bottom.h:4{{passing argument to parameter 'x' here}}
 
   // Names in multiple places in the diamond.
   top_left(&c);
@@ -20,10 +25,3 @@ void test_diamond(int i, float f, double d, char c) {
   lr.left = 17;
 }
 
-// RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_top %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_left %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_right %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=diamond_bottom %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t %s -verify
-// FIXME: When we have a syntax for modules in C, use that.
index 4e2ecef7d973982296da0c210000095c94c0b721..9cc9ae64bf9747a222269066ea3119214fb412e2 100644 (file)
@@ -1,13 +1,12 @@
-// FIXME: we should be able to put these in the .h file :-(
-// expected-note {{target of using declaration}}
-// expected-note {{using declaration}}
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -verify -fmodules -fmodules-cache-path=%t -I %S/Inputs %s
 
 #include "linkage-merge-bar.h"
 
 static int f(int);
 int f(int);
 
-static void g(int); // expected-error {{declaration conflicts with target of using declaration already in scope}}
-
-// RUN: rm -rf %t
-// RUN: %clang_cc1 -verify -fmodules -fmodules-cache-path=%t -I %S/Inputs %s
+static void g(int);
+// expected-error@-1 {{declaration conflicts with target of using declaration already in scope}}
+// expected-note@Inputs/linkage-merge-foo.h:2 {{target of using declaration}}
+// expected-note@Inputs/linkage-merge-bar.h:3 {{using declaration}}
index 16e220507831d3ad2039afade1ef4194592f8790..e838ca10183dff2867241adb63799930bbc3002c 100644 (file)
@@ -1,27 +1,26 @@
-// In module: expected-note{{previous declaration}}
-
-
-
-
-// In module: expected-note{{previous definition is here}}
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -emit-module -fmodule-name=linkage_merge_left %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -w %s -verify
 
 // Test redeclarations of functions where the original declaration is
 // still hidden.
 
 @import linkage_merge_left; // excludes "sub"
 
-extern int f0(float); // expected-error{{conflicting types for 'f0'}}
+extern int f0(float);
+// expected-error@-1{{conflicting types for 'f0'}}
+// expected-note@Inputs/linkage-merge-sub.h:1{{previous declaration}}
+
 static int f1(float); // okay: considered distinct
 static int f2(float); // okay: considered distinct
 extern int f3(float); // okay: considered distinct
 
-extern float v0; // expected-error{{redefinition of 'v0' with a different type: 'float' vs 'int'}}
+extern float v0;
+// expected-error@-1{{redefinition of 'v0' with a different type: 'float' vs 'int'}}
+// expected-note@Inputs/linkage-merge-sub.h:6{{previous definition is here}}
+
 static float v1;
 static float v2;
 extern float v3;
 
 typedef float T0;
-
-// RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -emit-module -fmodule-name=linkage_merge_left %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -w %s -verify
index 002b6d15566e6a1756274983121062f7dccee5e8..efd88f47e35e411cab36ae270445d565a547371a 100644 (file)
@@ -5,7 +5,7 @@ import lookup_left_cxx;
 #define IMPORT(X) @import X
 IMPORT(lookup_right_cxx);
 
-// in lookup_left.hpp: expected-warning@3 {{weak identifier 'weak_identifier' never declared}}
+// expected-warning@Inputs/lookup_left.hpp:3 {{weak identifier 'weak_identifier' never declared}}
 
 void test(int i, float f) {
   // unqualified lookup
index abe95420d4a5065b3defbfbe9275d5e796e11e07..54c74913907d23bc30000f064d99c76a6f30c6d8 100644 (file)
@@ -1,19 +1,19 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -emit-module -x objective-c -fmodule-name=lookup_left_objc %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -emit-module -x objective-c -fmodule-name=lookup_right_objc %S/Inputs/module.map
+// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -verify %s
+// RUN: %clang_cc1 -fmodules -ast-print -x objective-c -fmodules-cache-path=%t %s | FileCheck -check-prefix=CHECK-PRINT %s
 
-// lookup_left.h: expected-note{{using}}
-// lookup_right.h: expected-note{{also found}}
 @import lookup_left_objc;
 @import lookup_right_objc;
 
 void test(id x) {
-  [x method]; // expected-warning{{multiple methods named 'method' found}}
+  [x method];
+// expected-warning@-1{{multiple methods named 'method' found}}
+// expected-note@Inputs/lookup_left.h:2{{using}}
+// expected-note@Inputs/lookup_right.h:3{{also found}}
 }
 
-// RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -emit-module -x objective-c -fmodule-name=lookup_left_objc %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -emit-module -x objective-c -fmodule-name=lookup_right_objc %S/Inputs/module.map
-// RUN: %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -verify %s
-// RUN: %clang_cc1 -fmodules -ast-print -x objective-c -fmodules-cache-path=%t %s | FileCheck -check-prefix=CHECK-PRINT %s
-
 // CHECK-PRINT: - (int) method;
 // CHECK-PRINT: - (double) method
 // CHECK-PRINT: void test(id x)
index fc448d998906c230e2831142cf8b46c9477e3a59..433e03324bce7e9cc99276d57f1674add99bb9b6 100644 (file)
@@ -8,13 +8,13 @@
 // FIXME: When we have a syntax for modules in C, use that.
 // These notes come from headers in modules, and are bogus.
 
-// FIXME: expected-note{{previous definition is here}}
-// FIXME: expected-note{{previous definition is here}} expected-note{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}}
-// expected-note{{other definition of 'TOP_RIGHT_REDEF'}} expected-note{{expanding this definition of 'LEFT_RIGHT_DIFFERENT2'}}
-// expected-note{{other definition of 'LEFT_RIGHT_DIFFERENT'}}
-
-
-// expected-note{{expanding this definition of 'TOP_RIGHT_REDEF'}}
+// FIXME: expected-note@Inputs/macros_left.h:11{{previous definition is here}}
+// FIXME: expected-note@Inputs/macros_right.h:12{{previous definition is here}}
+// expected-note@Inputs/macros_right.h:12{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}}
+// expected-note@Inputs/macros_top.h:13{{other definition of 'TOP_RIGHT_REDEF'}}
+// expected-note@Inputs/macros_right.h:13{{expanding this definition of 'LEFT_RIGHT_DIFFERENT2'}}
+// expected-note@Inputs/macros_left.h:14{{other definition of 'LEFT_RIGHT_DIFFERENT'}}
+// expected-note@Inputs/macros_right.h:17{{expanding this definition of 'TOP_RIGHT_REDEF'}}
 
 @import macros;
 
index 9a8897b3830208256226de0e0b3249b753198eb4..6fd74b0885fd3cbb20c264f0a67bf94803fa01c9 100644 (file)
@@ -8,8 +8,8 @@
 - (void)method5:(D*)obj;
 @end
 
-// in other file: // expected-note@7{{using}}
-// in other file: expected-note@12{{also found}}
+// expected-note@Inputs/MethodPoolA.h:7{{using}}
+// expected-note@Inputs/MethodPoolB.h:12{{also found}}
 
 void testMethod1(id object) {
   [object method1]; 
@@ -51,8 +51,8 @@ void testMethod3Again(id object) {
 
 void testMethod3AgainAgain(id object) {
   [object method3]; // expected-warning{{multiple methods named 'method3' found}}
-  // expected-note@2{{using}}
-  // expected-note@2{{also found}}
+  // expected-note@Inputs/MethodPoolBSub.h:2{{using}}
+  // expected-note@Inputs/MethodPoolASub.h:2{{also found}}
 }
 
 void testMethod4Again(id object) {
index d4e73b53968bf2b52645f767cac80da1504925c3..438dcab9841caef92cf23f3597be1ca44c4c0207 100644 (file)
@@ -15,7 +15,7 @@ int test_broken() {
   HiddenStruct hidden; // \
   // expected-error{{must use 'struct' tag to refer to type 'HiddenStruct' in this scope}} \
   // expected-error{{definition of 'struct HiddenStruct' must be imported}}
-  // expected-note@3 {{previous definition is here}}
+  // expected-note@Inputs/module_private_left.h:3 {{previous definition is here}}
 
   Integer i; // expected-error{{unknown type name 'Integer'}}
 
index 0e9dbffcbb9eb87e6d16ff8f5eb6e50ca7b41c62..426e0025f9f84e0ea54ed566a69045823fca07ef 100644 (file)
@@ -73,5 +73,5 @@ void testAnonymousNotMerged() {
   N12::consumeFoo(N12::getFoo()); // expected-error{{cannot initialize a parameter of type 'N12::<anonymous>::Foo *' with an rvalue of type 'N12::<anonymous>::Foo *'}}  
 }
 
-// namespaces-right.h: expected-note@60 {{passing argument to parameter here}}
-// namespaces-right.h: expected-note@67 {{passing argument to parameter here}}
+// expected-note@Inputs/namespaces-right.h:60 {{passing argument to parameter here}}
+// expected-note@Inputs/namespaces-right.h:67 {{passing argument to parameter here}}
index 423e808bcabfbbe7c501b1db729f18146bdc979b..8155318fb310a02c29089aaf14216cd7c9528546 100644 (file)
@@ -1,5 +1,3 @@
-// Note: inside the module. expected-note{{'nested_umbrella_a' declared here}}
-
 // RUN: rm -rf %t
 // RUN: %clang_cc1 -x objective-c -fmodules-cache-path=%t -fmodules -I %S/Inputs/normal-module-map %s -verify
 #include "Umbrella/umbrella_sub.h"
@@ -25,7 +23,9 @@ int testNestedUmbrellaA() {
 }
 
 int testNestedUmbrellaBFail() {
-  return nested_umbrella_b; // expected-error{{use of undeclared identifier 'nested_umbrella_b'; did you mean 'nested_umbrella_a'?}}
+  return nested_umbrella_b;
+  // expected-error@-1{{use of undeclared identifier 'nested_umbrella_b'; did you mean 'nested_umbrella_a'?}}
+  // expected-note@Inputs/normal-module-map/nested_umbrella/a.h:1{{'nested_umbrella_a' declared here}}
 }
 
 @import nested_umbrella.b;
index d3ebcb7527904bfacb97645c1697cce9125536f2..81fb28bafb2a3223420a57737541cc4e8659e155 100644 (file)
@@ -8,11 +8,8 @@
 
 @import category_bottom;
 
-
-
-
-// in category_left.h: expected-note {{previous definition}}
-// in category_right.h: expected-warning@11 {{duplicate definition of category}}
+// expected-note@Inputs/category_left.h:14 {{previous definition}}
+// expected-warning@Inputs/category_right.h:11 {{duplicate definition of category}}
 
 @interface Foo(Source)
 -(void)source; 
@@ -75,7 +72,7 @@ void test_hidden_right_errors(Foo *foo) {
   [p4 p4_method]; // expected-warning{{instance method '-p4_method' not found (return type defaults to 'id')}}
   id p4p = p4.p4_prop; // expected-error{{property 'p4_prop' not found on object of type 'id<P4>'}}
   p4p = foo.p4_prop; // expected-error{{property 'p4_prop' not found on object of type 'Foo *'; did you mean 'p3_prop'?}}
-  // expected-note@7{{'p3_prop' declared here}}
+  // expected-note@Inputs/category_left_sub.h:7{{'p3_prop' declared here}}
 }
 
 @import category_right.sub;
index 31742f7e03a2432ba646affa8c2f7ae98c3c7fbf..e9587594202953b1c92a0741938b4a4476d0380d 100644 (file)
@@ -7,7 +7,7 @@
 @interface OtherClass
 @end
 
-// in module: expected-note@17{{class method 'alloc' is assumed to return an instance of its receiver type ('Module *')}}
+// expected-note@Inputs/Module.framework/Headers/Module.h:17{{class method 'alloc' is assumed to return an instance of its receiver type ('Module *')}}
 void test_getModuleVersion() {
   const char *version = getModuleVersion();
   const char *version2 = [Module version];
index e37366748d04ef520113c86b987432d40b15d2c6..37e5967f4e3b61b4a5677a38b211d61c86641df1 100644 (file)
@@ -27,8 +27,8 @@ int *call_eventually_noreturn_again(void) {
 int *call_eventually_noreturn2_again(void) {
   // noreturn and non-noreturn functions have different types
   eventually_noreturn2(); // expected-error{{call to 'eventually_noreturn2' is ambiguous}}
-  // expected-note@93{{candidate function}}
-  // expected-note@90{{candidate function}}
+  // expected-note@Inputs/redecl-merge-left.h:93{{candidate function}}
+  // expected-note@Inputs/redecl-merge-right.h:90{{candidate function}}
 }
 
 @implementation A
@@ -79,24 +79,26 @@ void testTypedefMerge(int i, double d) {
   T1 *ip = &i;
   // FIXME: Typedefs aren't actually merged in the sense of other merges, because
   // we should only merge them when the types are identical.
-  // in other file: expected-note@60{{candidate found by name lookup is 'T2'}}
-  // in other file: expected-note@63{{candidate found by name lookup is 'T2'}}
+  // expected-note@Inputs/redecl-merge-left.h:60{{candidate found by name lookup is 'T2'}}
+  // expected-note@Inputs/redecl-merge-right.h:63{{candidate found by name lookup is 'T2'}}
   T2 *dp = &d; // expected-error{{reference to 'T2' is ambiguous}}
 }
 
 void testFuncMerge(int i) {
   func0(i);
   func1(i);
-  // in other file: expected-note@64{{candidate function}}
-  // in other file: expected-note@70{{candidate function}}
+  // expected-note@Inputs/redecl-merge-left.h:64{{candidate function}}
+  // expected-note@Inputs/redecl-merge-right.h:70{{candidate function}}
   func2(i); // expected-error{{call to 'func2' is ambiguous}}
 }
 
 void testVarMerge(int i) {
   var1 = i;
-  // in other files: expected-note@77 2{{candidate found by name lookup is 'var2'}}
+  // expected-note@Inputs/redecl-merge-left.h:77{{candidate found by name lookup is 'var2'}}
+  // expected-note@Inputs/redecl-merge-right.h:77{{candidate found by name lookup is 'var2'}}
   var2 = i; // expected-error{{reference to 'var2' is ambiguous}}
-  // in other files: expected-note@79 2{{candidate found by name lookup is 'var3'}}
+  // expected-note@Inputs/redecl-merge-left.h:79{{candidate found by name lookup is 'var3'}}
+  // expected-note@Inputs/redecl-merge-right.h:79{{candidate found by name lookup is 'var3'}}
   var3 = i; // expected-error{{reference to 'var3' is ambiguous}}
 }
 
index 22dfcca3657a08306dac522e01b2ba612abc409e..ad70cc2b22f8a0e754dab3e3b087aab8ec30ff83 100644 (file)
@@ -23,7 +23,7 @@ CXXOnly cxxonly;
 
 @import HasSubModules;
 
-// expected-warning@1{{treating #include as an import of module 'HasSubModules.Sub.Types'}}
+// expected-warning@Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h:1{{treating #include as an import of module 'HasSubModules.Sub.Types'}}
 #import <HasSubModules/HasSubModulesPriv.h>
 
 struct FrameworkSubStruct ss;
index 2ca7dad0dd16cb0ab2c76f106ab74c62d5f91aca..2cab1f031a9618a3e4d501d89fe935825af3ddff 100644 (file)
@@ -6,10 +6,9 @@
 // RUN: %clang_cc1 -include-pch %t -fsyntax-only -verify %s 
 
 void m() {
-    D s;   // expected-note {{candidate function}}
+    D s;
     s.f(); // expected-error {{no matching member}}
 }
 
-
-
-// expected-note {{candidate function}}
+// expected-note@cxx-using.h:9  {{candidate function}}
+// expected-note@cxx-using.h:15 {{candidate function}}
index 3bb7b40aa96a27f40b1df5f42cbe964db8b06fe9..722ca6e9ffa32c18c78eb0d788929689997f5e48 100644 (file)
@@ -4,8 +4,7 @@
 // RUN: %clang_cc1 -x c++-header -emit-pch -std=c++11 -o %t %S/Inputs/cxx11-statement-attributes.h
 // RUN: %clang_cc1 -include-pch %t -std=c++11 -Wimplicit-fallthrough -fsyntax-only %s -o - -verify
 
-// Warning from Inputs/cxx11-statement-attributes.h:
-// expected-warning@10 {{fallthrough annotation does not directly precede switch label}}
+// expected-warning@Inputs/cxx11-statement-attributes.h:10 {{fallthrough annotation does not directly precede switch label}}
 
 void g(int n) {
   f<1>(n);  // expected-note {{in instantiation of function template specialization 'f<1>' requested here}}
index 35e39210585b64f8eeb50e0b5135d8dec1307e3f..fa2ba8d29c038e77be0ee6718e4e8a0ef1567c09 100644 (file)
@@ -4,18 +4,20 @@
 // Test with pch.
 // RUN: %clang_cc1 -emit-pch -o %t %S/functions.h
 // RUN: %clang_cc1 -include-pch %t -fsyntax-only -verify %s 
-// expected-note{{'f1' declared here}}
+
 int f0(int x0, int y0, ...) { return x0 + y0; }
-// expected-note{{passing argument to parameter here}}
+
 float *test_f1(int val, double x, double y) {
   if (val > 5)
     return f1(x, y);
   else
     return f1(x); // expected-error{{too few arguments to function call}}
+                  // expected-note@functions.h:7{{'f1' declared here}}
 }
 
 void test_g0(int *x, float * y) {
   g0(y); // expected-warning{{incompatible pointer types passing 'float *' to parameter of type 'int *'}}
+         // expected-note@functions.h:9{{passing argument to parameter here}}
   g0(x); 
 }
 
index 20010fbd1c56b7eb8eb60e135276bc841b1c8f27..139f8ba4a69bddc60fda45cb156f7e7c9e23b9ca 100644 (file)
@@ -9,13 +9,5 @@ int message_id(id x) {
    return [x instMethod:17]; // expected-warning{{multiple methods}}
 }
 
-
-
-
-
-/* Whitespace below is significant */
-/* expected-note{{using}} */
-
-
-
-/* expected-note{{also}} */
+/* expected-note@method_pool.h:17{{using}} */
+/* expected-note@method_pool.h:21{{also}} */
index 49392ca2fef5d12fa7bf3820c1dc7ff9344fdc92..092e2c9d9bfb7a09a03c0ec24844df3e52b61c0c 100644 (file)
@@ -7,4 +7,4 @@
 
 int g(int, float); // expected-error{{conflicting types}}
 
-// expected-note{{previous declaration}}
+// expected-note@nonvisible-external-defs.h:10{{previous declaration}}
index 4c426e4f7736b6712d36c708b94a12a478fe4803..8dabb8b03d0b6547ee421e2ad65a0386dbc4ba84 100644 (file)
@@ -10,5 +10,5 @@ int x = 2; // expected-error{{redefinition}}
 int y = 5; // expected-error{{redefinition}}
 
 
-// expected-note{{previous definition}}
-// expected-note{{previous definition}}
+// expected-note@libroot/usr/include/reloc.h:13{{previous definition}}
+// expected-note@libroot/usr/include/reloc2.h:14{{previous definition}}
index 0072818a1a2f9538f78560a077015a513be3f754..42882307dc73f99ded7b616624f12e31068d5fde 100644 (file)
@@ -5,5 +5,4 @@
 // RUN: grep "@variable = common global i32 0" %t | count 1
 // RUN: grep "@incomplete_array = common global .*1 x i32" %t | count 1
 
-
-// FIXME: tentative-defs.h expected-warning{{tentative}}
+// FIXME: expected-warning@tentative-defs.h:9{{tentative}}
index f8161d17df4ed5dbfde200670428f8088af89162..6ab66c2cabf7ef2955fca6d03d9be38787d8f7ae 100644 (file)
@@ -1,17 +1,14 @@
-
-// In header: expected-note{{'boost::function' declared here}}
-
-
-// In header: expected-note{{'boost::graph::adjacency_list' declared here}}
-
-
-
-adjacent_list<int, int> g; // expected-error{{no template named 'adjacent_list'; did you mean 'boost::graph::adjacency_list'?}}
-Function<int(int)> f; // expected-error{{no template named 'Function'; did you mean 'boost::function'?}}
-
 // Without PCH
 // RUN: %clang_cc1 -include %S/Inputs/typo.hpp -verify %s
 
 // With PCH
 // RUN: %clang_cc1 -x c++-header -emit-pch -o %t %S/Inputs/typo.hpp
 // RUN: %clang_cc1 -include-pch %t -verify %s
+
+adjacent_list<int, int> g;
+// expected-error@-1{{no template named 'adjacent_list'; did you mean 'boost::graph::adjacency_list'?}}
+// expected-note@Inputs/typo.hpp:5{{'boost::graph::adjacency_list' declared here}}
+
+Function<int(int)> f;
+// expected-error@-1{{no template named 'Function'; did you mean 'boost::function'?}}
+// expected-note@Inputs/typo.hpp:2{{'boost::function' declared here}}
index c6f0275bc2fdc3ade6e01e833a9d0b5818be6bf0..876b9438d1b7cd089c99b8b63d5b0cd891e0a34a 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -x objective-c-header -emit-pch -o %t %S/Inputs/typo.h
 // RUN: %clang_cc1 -include-pch %t -verify %s
-// In header: expected-note{{declared here}}
+
 void f() {
   [NSstring alloc]; // expected-error{{unknown receiver 'NSstring'; did you mean 'NSString'?}}
+                    // expected-note@Inputs/typo.h:3{{declared here}}
 }
index b646e8966c6183d3b3f1a893d18ab842cd195929..c1aa804557ac450fa891f357d2da3a6b81d52fa2 100644 (file)
@@ -13,6 +13,6 @@
 #include "Inputs/pragma-arc-cf-code-audited.h" // expected-error {{cannot #include files inside '#pragma clang arc_cf_code_audited'}}
 
 // This is actually on the #pragma line in the header.
-// expected-error {{'#pragma clang arc_cf_code_audited' was not ended within this file}}
+// expected-error@Inputs/pragma-arc-cf-code-audited.h:16 {{'#pragma clang arc_cf_code_audited' was not ended within this file}}
 
 #pragma clang arc_cf_code_audited begin // expected-error {{'#pragma clang arc_cf_code_audited' was not ended within this file}}
index 3443bda99bb31e55d0fb1aa8e012aa087142e3df..d9392ed73f18d7bdd7950addd832b372464ad14a 100644 (file)
@@ -1,30 +1,30 @@
-// silly workaround expected-note {{marked unavailable here}}
 // RUN: %clang_cc1 -fobjc-arc -isystem %S/Inputs %s -DNO_USE
 // RUN: %clang_cc1 -fobjc-arc -isystem %S/Inputs %s -verify
 
-// another silly workaround expected-note {{marked unavailable here}}
 #include <arc-system-header.h>
 
 #ifndef NO_USE
 void test(id op, void *cp) {
   cp = test0(op); // expected-error {{'test0' is unavailable: converts between Objective-C and C pointers in -fobjc-arc}}
   cp = *test1(&op); // expected-error {{'test1' is unavailable: converts between Objective-C and C pointers in -fobjc-arc}}
+// expected-note@arc-system-header.h:1 {{marked unavailable here}}
+// expected-note@arc-system-header.h:5 {{marked unavailable here}}
 }
 
-// workaround expected-note {{marked unavailable here}}
 void test3(struct Test3 *p) {
   p->field = 0; // expected-error {{'field' is unavailable: this system declaration uses an unsupported type}}
+                // expected-note@arc-system-header.h:14 {{marked unavailable here}}
 }
 
-// workaround expected-note {{marked unavailable here}}
 void test4(Test4 *p) {
   p->field1 = 0; // expected-error {{'field1' is unavailable: this system declaration uses an unsupported type}}
+                 // expected-note@arc-system-header.h:19 {{marked unavailable here}}
   p->field2 = 0;
 }
 
-// workaround expected-note {{marked unavailable here}}
 void test5(struct Test5 *p) {
   p->field = 0; // expected-error {{'field' is unavailable: this system field has retaining ownership}}
+                // expected-note@arc-system-header.h:25 {{marked unavailable here}}
 }
 
 id test6() {
@@ -38,12 +38,13 @@ id test6() {
   x = (id) (test6_helper(), kMagicConstant);
 }
 
-// workaround expected-note 4 {{marked unavailable here}} expected-note 2 {{property 'prop' is declared unavailable here}}
 void test7(Test7 *p) {
   *p.prop = 0; // expected-error {{'prop' is unavailable: this system declaration uses an unsupported type}}
   p.prop = 0; // expected-error {{'prop' is unavailable: this system declaration uses an unsupported type}}
   *[p prop] = 0; // expected-error {{'prop' is unavailable: this system declaration uses an unsupported type}}
   [p setProp: 0]; // expected-error {{'setProp:' is unavailable: this system declaration uses an unsupported type}}
+// expected-note@arc-system-header.h:41 4 {{marked unavailable here}}
+// expected-note@arc-system-header.h:41 2 {{property 'prop' is declared unavailable here}}
 }
 #endif
 
index 107b5b5a53d247ec4ae869b09e29994589591227..3358e5fc1277ae8ec0cf44f2774db37449f5319a 100644 (file)
@@ -6,5 +6,4 @@ void f(A* a) {
   a->data.void_ptr = 0;
   a->data.a_b.b = 0; // expected-error{{'a_b' is unavailable: this system field has retaining ownership}}
 }
-// Silly location below
-// expected-note{{declaration has been explicitly marked unavailable here}}
+// expected-note@arc-system-header.h:10{{declaration has been explicitly marked unavailable here}}