Clang Pragma 错误:标记为“覆盖”,但不覆盖

时间:2021-03-29 15:48:58

标签: c++ clang

我试图在 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 错误。但是我添加的结构与其他固有的编译指示结构相同。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

根据错误信息判断你的函数的第二个参数应该是类型 clang::PragmaIntroducer,而不是 clang::PragmaIntroducerKind

您不使用此参数,因此相应地更改代码应该很容易。

相关问题