From: Dmitri Gribenko Date: Thu, 21 Jun 2012 22:04:37 +0000 (+0000) Subject: Handle include directive with comments. It turns out that in this case comments... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e601b237e495bb15a5e5df2e20c61fa01a6c4df0;p=clang Handle include directive with comments. It turns out that in this case comments are not coming in source order. Instead of trying to std::sort() comments (which can be costly), just remove comments that are not in order. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158940 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RawCommentList.cpp b/lib/AST/RawCommentList.cpp index f32e628caa..438fdcd24c 100644 --- a/lib/AST/RawCommentList.cpp +++ b/lib/AST/RawCommentList.cpp @@ -158,13 +158,15 @@ void RawCommentList::addComment(const RawComment &RC) { if (RC.isInvalid()) return; - assert((Comments.empty() || - Comments.back().getSourceRange().getEnd() == - RC.getSourceRange().getBegin() || - SourceMgr.isBeforeInTranslationUnit( - Comments.back().getSourceRange().getEnd(), - RC.getSourceRange().getBegin())) && - "comments are not coming in source order"); + // Check if the comments are not in source order. + while (!Comments.empty() && + !SourceMgr.isBeforeInTranslationUnit( + Comments.back().getSourceRange().getBegin(), + RC.getSourceRange().getBegin())) { + // If they are, just pop a few last comments that don't fit. + // This happens if an \#include directive contains comments. + Comments.pop_back(); + } if (OnlyWhitespaceSeen) { if (!onlyWhitespaceBetweenComments(SourceMgr, LastComment, RC)) diff --git a/test/Index/Inputs/annotate-comments-preprocessor.h b/test/Index/Inputs/annotate-comments-preprocessor.h new file mode 100644 index 0000000000..220f36ede4 --- /dev/null +++ b/test/Index/Inputs/annotate-comments-preprocessor.h @@ -0,0 +1,2 @@ +/* Meow */ + diff --git a/test/Index/annotate-comments-preprocessor.c b/test/Index/annotate-comments-preprocessor.c new file mode 100644 index 0000000000..202847ff9c --- /dev/null +++ b/test/Index/annotate-comments-preprocessor.c @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -fsyntax-only -I%S/Inputs %s + +// As long as none of this crashes, we don't care about comments in +// preprocessor directives. + +#include "annotate-comments-preprocessor.h" /* Aaa. */ /* Bbb. */ +#include "annotate-comments-preprocessor.h" /* Aaa. */ +#include "annotate-comments-preprocessor.h" /** Aaa. */ +#include "annotate-comments-preprocessor.h" /**< Aaa. */ +#include "annotate-comments-preprocessor.h" // Aaa. +#include "annotate-comments-preprocessor.h" /// Aaa. +#include "annotate-comments-preprocessor.h" ///< Aaa. + +#define A0 0 +#define A1 1 /* Aaa. */ +#define A2 1 /** Aaa. */ +#define A3 1 /**< Aaa. */ +#define A4 1 // Aaa. +#define A5 1 /// Aaa. +#define A6 1 ///< Aaa. + +int A[] = { A0, A1, A2, A3, A4, A5, A6 }; + +#if A0 /** Aaa. */ +int f(int a1[A1], int a2[A2], int a3[A3], int a4[A4], int a5[A5], int a6[A6]); +#endif /** Aaa. */ + +#if A1 /** Aaa. */ +int g(int a1[A1], int a2[A2], int a3[A3], int a4[A4], int a5[A5], int a6[A6]); +#endif /* Aaa. */ + +#pragma once /** Aaa. */ + +#define FOO \ + do { \ + /* Aaa. */ \ + /** Aaa. */ \ + /**< Aaa. */ \ + ; \ + } while(0) + +void h(void) { + FOO; +} +