diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-10-07 14:31:32 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-10-08 09:20:10 +0000 |
commit | 54fefd89b86f9b7c3496317bcfcf3882ff72e67c (patch) | |
tree | 284667f5855e901148f5e7f70aae87a4c28db275 /src/libs/3rdparty/cplusplus | |
parent | c2aaa9340881f8220c5683d253a147c2cd77ff6e (diff) |
C++: Transfer noexcept specifier for refactoring actions
This applies for e.g.
* "Add Definition..." (on function decl)
* "Move Definition..." (on function decl)
* "Insert Virtual Functions of Base Class" (on class specifier)
Fixes: QTCREATORBUG-11849
Fixes: QTCREATORBUG-19699
Change-Id: I0d259bc1782470f3b3f19617230005a5594a5cca
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.h | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.h | 6 |
4 files changed, 18 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index 053d4f1388..486efffc3d 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -1232,7 +1232,7 @@ FullySpecifiedType Bind::trailingReturnType(TrailingReturnTypeAST *ast, const Fu return type; } -const StringLiteral *Bind::asStringLiteral(const ExpressionAST *ast) +const StringLiteral *Bind::asStringLiteral(const AST *ast) { CPP_ASSERT(ast, return nullptr); const int firstToken = ast->firstToken(); @@ -3265,7 +3265,11 @@ bool Bind::visit(FunctionDeclaratorAST *ast) Function::RvalueRefQualifier); } + // propagate exception spec this->exceptionSpecification(ast->exception_specification, type); + if (ExceptionSpecificationAST *spec = ast->exception_specification) + fun->setExceptionSpecification(asStringLiteral(spec)); + if (ast->as_cpp_initializer != nullptr) { fun->setAmbiguous(true); /*ExpressionTy as_cpp_initializer =*/ this->expression(ast->as_cpp_initializer); diff --git a/src/libs/3rdparty/cplusplus/Bind.h b/src/libs/3rdparty/cplusplus/Bind.h index 0898722964..ddeb46532e 100644 --- a/src/libs/3rdparty/cplusplus/Bind.h +++ b/src/libs/3rdparty/cplusplus/Bind.h @@ -104,7 +104,7 @@ protected: void capture(CaptureAST *ast); Function *lambdaDeclarator(LambdaDeclaratorAST *ast); FullySpecifiedType trailingReturnType(TrailingReturnTypeAST *ast, const FullySpecifiedType &init); - const StringLiteral *asStringLiteral(const ExpressionAST *ast); + const StringLiteral *asStringLiteral(const AST *ast); virtual bool preVisit(AST *); virtual void postVisit(AST *); diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp index a895f7ed6c..aba1be3494 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.cpp +++ b/src/libs/3rdparty/cplusplus/Symbols.cpp @@ -303,6 +303,7 @@ Function::Function(TranslationUnit *translationUnit, int sourceLocation, const N Function::Function(Clone *clone, Subst *subst, Function *original) : Scope(clone, subst, original) , _returnType(clone->type(original->_returnType, subst)) + , _exceptionSpecification(original->_exceptionSpecification) , _flags(original->_flags) { } @@ -534,6 +535,11 @@ bool Function::maybeValidPrototype(int actualArgumentCount) const return true; } +const StringLiteral *Function::exceptionSpecification() +{ return _exceptionSpecification; } + +void Function::setExceptionSpecification(const StringLiteral *spec) +{ _exceptionSpecification = spec; } Block::Block(TranslationUnit *translationUnit, int sourceLocation) : Scope(translationUnit, sourceLocation, /*name = */ nullptr) diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h index fd9417984e..71a076ac80 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.h +++ b/src/libs/3rdparty/cplusplus/Symbols.h @@ -29,6 +29,8 @@ namespace CPlusPlus { +class StringLiteral; + class CPLUSPLUS_EXPORT UsingNamespaceDirective: public Symbol { public: @@ -363,6 +365,9 @@ public: bool maybeValidPrototype(int actualArgumentCount) const; + const StringLiteral *exceptionSpecification(); + void setExceptionSpecification(const StringLiteral *spec); + // Symbol's interface virtual FullySpecifiedType type() const; @@ -386,6 +391,7 @@ protected: private: FullySpecifiedType _returnType; + const StringLiteral *_exceptionSpecification = nullptr; struct Flags { unsigned _isVirtual: 1; unsigned _isOverride: 1; |