diff --git a/clang/lib/Frontend/Rewrite/RewriteBSC.cpp b/clang/lib/Frontend/Rewrite/RewriteBSC.cpp index 8d98c5aac561015da58b6561039e898d7d8d94d4..35b3d00c23e1fb8d098d7fc1b661045b9f9c966b 100644 --- a/clang/lib/Frontend/Rewrite/RewriteBSC.cpp +++ b/clang/lib/Frontend/Rewrite/RewriteBSC.cpp @@ -790,11 +790,19 @@ void RewriteBSC::RewriteNonGenericFuncAndVar(std::vector &DeclList) { PrintDebugLineInfo(FD); FD->print(Buf, Policy); } else { - const char *startBuf = SM->getCharacterData(FD->getBeginLoc()); - const char *endBuf = SM->getCharacterData(FD->getEndLoc()); - if (startBuf == endBuf) - break; - Buf << std::string(startBuf, endBuf - startBuf + 1); + bool Invalid = false; + Lexer::getSourceText( + CharSourceRange::getCharRange(FD->getSourceRange()), *SM, + LangOpts, &Invalid); + if (Invalid) { + FD->print(Buf, Policy); + } else { + const char *startBuf = SM->getCharacterData(FD->getBeginLoc()); + const char *endBuf = SM->getCharacterData(FD->getEndLoc()); + if (startBuf == endBuf) + break; + Buf << std::string(startBuf, endBuf - startBuf + 1); + } if (FD->isThisDeclarationADefinition()) { Buf << "\n"; } diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h new file mode 100644 index 0000000000000000000000000000000000000000..5a38ea5a31fe4b579c7dcb5b548706624e42d7e9 --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h @@ -0,0 +1,5 @@ +#include "b.h" +#include "c.hbs" + + +void foo(const char *a, const char *b, ...) FMT_PRINT(2, 3); \ No newline at end of file diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h new file mode 100644 index 0000000000000000000000000000000000000000..12adf0bb65c08e75e0001833e28cf54994ae4811 --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h @@ -0,0 +1 @@ +#define FMT_PRINT(a, b) __attribute__((format(printf, (a), (b)))) \ No newline at end of file diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs new file mode 100644 index 0000000000000000000000000000000000000000..ad7f982540ea2e0bc889e66cc6868f24cc0aef7b --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs @@ -0,0 +1,5 @@ +#include +#include +#include +#include +#include diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs new file mode 100644 index 0000000000000000000000000000000000000000..2cf2d29eb28eeef8a170008d0c23dd1f67a9690f --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs @@ -0,0 +1,17 @@ +// RUN: %clang -c %s -o %t.output.o +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang -c %t-rw.c -o %t-rw.output -I%S +// expected-no-diagnostics + +#include "a.h" + +// CHECK: #include "b.h" +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-EMPTY: +// CHECK-EMPTY: +// CHECK-NEXT: __attribute__((format(printf, 2, 3))) void foo(const char *a, const char *b, ...);