diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2016-07-31 23:53:01 +0300 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2016-08-19 13:34:38 +0000 |
commit | e9197468083e98392f11ee51100734243a435f91 (patch) | |
tree | 28bef2a518b9fb9239deb0d9a774fb662fc093c6 /src/libs/3rdparty/cplusplus | |
parent | e920921f277fd8cbde509f92c5b3913f228da1c0 (diff) |
C++: Store template typename argument declarator type
Differentiate class from typename. Used by a follow-up commit for pretty
printing, preserving the original declarator.
Change-Id: I496505f5062abb69d5552e5422db256d49d164c4
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.h | 3 |
3 files changed, 7 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index a97c71ec5c..1f082a6ec8 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -2388,9 +2388,11 @@ bool Bind::visit(TypenameTypeParameterAST *ast) // unsigned dot_dot_dot_token = ast->dot_dot_dot_token; const Name *name = this->name(ast->name); ExpressionTy type_id = this->expression(ast->type_id); + CPlusPlus::Kind classKey = translationUnit()->tokenKind(ast->classkey_token); TypenameArgument *arg = control()->newTypenameArgument(sourceLocation, name); arg->setType(type_id); + arg->setClassDeclarator(classKey == T_CLASS); ast->symbol = arg; _scope->addMember(arg); return false; diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp index 6a69ca2dc4..253bb04788 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.cpp +++ b/src/libs/3rdparty/cplusplus/Symbols.cpp @@ -171,11 +171,13 @@ void Argument::visitSymbol0(SymbolVisitor *visitor) TypenameArgument::TypenameArgument(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name) : Symbol(translationUnit, sourceLocation, name) + , _isClassDeclarator(false) { } TypenameArgument::TypenameArgument(Clone *clone, Subst *subst, TypenameArgument *original) : Symbol(clone, subst, original) , _type(clone->type(original->_type, subst)) + , _isClassDeclarator(original->_isClassDeclarator) { } TypenameArgument::~TypenameArgument() diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h index a545644cfa..4cd8141beb 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.h +++ b/src/libs/3rdparty/cplusplus/Symbols.h @@ -187,6 +187,8 @@ public: virtual ~TypenameArgument(); void setType(const FullySpecifiedType &type); + void setClassDeclarator(bool isClassDecl) { _isClassDeclarator = isClassDecl; } + bool isClassDeclarator() const { return _isClassDeclarator; } // Symbol's interface virtual FullySpecifiedType type() const; @@ -202,6 +204,7 @@ protected: private: FullySpecifiedType _type; + bool _isClassDeclarator; }; class CPLUSPLUS_EXPORT Block: public Scope |