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>
This commit is contained in:
Orgad Shaneh
2016-07-31 23:53:01 +03:00
committed by Orgad Shaneh
parent e920921f27
commit e919746808
3 changed files with 7 additions and 0 deletions

View File

@@ -2388,9 +2388,11 @@ bool Bind::visit(TypenameTypeParameterAST *ast)
// unsigned dot_dot_dot_token = ast->dot_dot_dot_token; // unsigned dot_dot_dot_token = ast->dot_dot_dot_token;
const Name *name = this->name(ast->name); const Name *name = this->name(ast->name);
ExpressionTy type_id = this->expression(ast->type_id); ExpressionTy type_id = this->expression(ast->type_id);
CPlusPlus::Kind classKey = translationUnit()->tokenKind(ast->classkey_token);
TypenameArgument *arg = control()->newTypenameArgument(sourceLocation, name); TypenameArgument *arg = control()->newTypenameArgument(sourceLocation, name);
arg->setType(type_id); arg->setType(type_id);
arg->setClassDeclarator(classKey == T_CLASS);
ast->symbol = arg; ast->symbol = arg;
_scope->addMember(arg); _scope->addMember(arg);
return false; return false;

View File

@@ -171,11 +171,13 @@ void Argument::visitSymbol0(SymbolVisitor *visitor)
TypenameArgument::TypenameArgument(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name) TypenameArgument::TypenameArgument(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
: Symbol(translationUnit, sourceLocation, name) : Symbol(translationUnit, sourceLocation, name)
, _isClassDeclarator(false)
{ } { }
TypenameArgument::TypenameArgument(Clone *clone, Subst *subst, TypenameArgument *original) TypenameArgument::TypenameArgument(Clone *clone, Subst *subst, TypenameArgument *original)
: Symbol(clone, subst, original) : Symbol(clone, subst, original)
, _type(clone->type(original->_type, subst)) , _type(clone->type(original->_type, subst))
, _isClassDeclarator(original->_isClassDeclarator)
{ } { }
TypenameArgument::~TypenameArgument() TypenameArgument::~TypenameArgument()

View File

@@ -187,6 +187,8 @@ public:
virtual ~TypenameArgument(); virtual ~TypenameArgument();
void setType(const FullySpecifiedType &type); void setType(const FullySpecifiedType &type);
void setClassDeclarator(bool isClassDecl) { _isClassDeclarator = isClassDecl; }
bool isClassDeclarator() const { return _isClassDeclarator; }
// Symbol's interface // Symbol's interface
virtual FullySpecifiedType type() const; virtual FullySpecifiedType type() const;
@@ -202,6 +204,7 @@ protected:
private: private:
FullySpecifiedType _type; FullySpecifiedType _type;
bool _isClassDeclarator;
}; };
class CPLUSPLUS_EXPORT Block: public Scope class CPLUSPLUS_EXPORT Block: public Scope