我试图在 clang 中添加新的编译指示,并按照 LLVM document 中的步骤操作(从第 30 页开始)。我在 TokenKinds.def
,
ANNOTATION(pragma_begin_mark)
并在Pragma Handler
中定义Parser.h
std::unique_ptr<PragmaHandler> BeginObfHandler;
然后我在 ParsePragma.cpp
中添加了新的结构体。我还按如下方式覆盖了 HandlePragma 函数。
namespace{
struct PragmaBeginMarkHandler : public PragmaHandler{
PragmaBeginMarkHandler() : PragmaHandler("begin_mark"){}
void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
Token &FirstToken) override;
};
}
void PragmaBeginMarkHandler::HandlePragma(Preprocessor &PP,
PragmaIntroducerKind Introducer,
Token &FirstToken){
MyPragmaHandler(PP,FirstToken,true);
}
但是,在完成所有操作后,我通过 make clang
重新编译了 clang 并出现以下错误。
/home/yuweitt/llvm/llvm-project/clang/lib/Parse/ParsePragma.cpp:30:10: error: ‘void {anonymous}::PragmaBeginMarkHandler::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducerKind, clang::Token&)’ marked ‘override’, but does not override
30 | void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
| ^~~~~~~~~~~~
In file included from /home/yuweitt/llvm/llvm-project/clang/include/clang/Lex/PPCallbacks.h:21,
from /home/yuweitt/llvm/llvm-project/clang/include/clang/Lex/Preprocessor.h:29,
from /home/yuweitt/llvm/llvm-project/clang/lib/Parse/ParsePragma.cpp:16:
/home/yuweitt/llvm/llvm-project/clang/include/clang/Lex/Pragma.h:74:16: warning: ‘virtual void clang::PragmaHandler::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&)’ was hidden [-Woverloaded-virtual]
74 | virtual void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
| ^~~~~~~~~~~~
/home/yuweitt/llvm/llvm-project/clang/lib/Parse/ParsePragma.cpp:30:10: warning: by ‘void {anonymous}::PragmaBeginMarkHandler::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducerKind, clang::Token&)’ [-Woverloaded-virtual]
30 | void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
/home/yuweitt/llvm/llvm-project/clang/lib/Parse/ParsePragma.cpp:340:53: error: invalid new-expression of abstract class type ‘{anonymous}::PragmaBeginMarkHandler’
340 | BeginMarkHandler.reset(new PragmaBeginMarkHandler());
| ^
/home/yuweitt/llvm/llvm-project/clang/lib/Parse/ParsePragma.cpp:28:8: note: because the following virtual functions are pure within ‘{anonymous}::PragmaBeginMarkHandler’:
28 | struct PragmaBeginMarkHandler : public PragmaHandler{
| ^~~~~~~~~~~~~~~~~~~~~~
In file included from /home/yuweitt/llvm/llvm-project/clang/include/clang/Lex/PPCallbacks.h:21,
from /home/yuweitt/llvm/llvm-project/clang/include/clang/Lex/Preprocessor.h:29,
from /home/yuweitt/llvm/llvm-project/clang/lib/Parse/ParsePragma.cpp:16:
/home/yuweitt/llvm/llvm-project/clang/include/clang/Lex/Pragma.h:74:16: note: ‘virtual void clang::PragmaHandler::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&)’
74 | virtual void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
我添加的结构体似乎被认为是匿名结构体,因此发生了 marked ‘override’, but does not override
错误。但是我添加的结构与其他固有的编译指示结构相同。我该如何解决这个问题?
答案 0 :(得分:2)
根据错误信息判断你的函数的第二个参数应该是类型
clang::PragmaIntroducer
,而不是 clang::PragmaIntroducerKind
。
您不使用此参数,因此相应地更改代码应该很容易。