source: translator/ResolvExpr/ResolveTypeof.cc @ b87a5ed

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since b87a5ed was d9a0e76, checked in by Peter A. Buhr <pabuhr@…>, 10 years ago

remove Parser.old, add -XCFA to driver, copy ptrdiff_t from stddef.h in preclude, remove casts from initialization constants, adjust formatting

  • Property mode set to 100644
File size: 1.5 KB
RevLine 
[51b7345]1#include "ResolveTypeof.h"
2#include "Alternative.h"
3#include "AlternativeFinder.h"
4#include "Resolver.h"
5#include "TypeEnvironment.h"
6#include "SynTree/Expression.h"
7#include "SynTree/Type.h"
8
9namespace ResolvExpr {
[d9a0e76]10    namespace {
[51b7345]11#if 0
[d9a0e76]12        void
13        printAlts( const AltList &list, std::ostream &os, int indent = 0 )
14        {
15            for( AltList::const_iterator i = list.begin(); i != list.end(); ++i ) {
16                i->print( os, indent );
17                os << std::endl;
18            }
19        }
[51b7345]20#endif
[d9a0e76]21    }
[51b7345]22
[d9a0e76]23    class ResolveTypeof : public Mutator {
24      public:
25        ResolveTypeof( const SymTab::Indexer &indexer ) : indexer( indexer ) {}
26        Type *mutate( TypeofType *typeofType );
[51b7345]27
[d9a0e76]28      private:
29        const SymTab::Indexer &indexer;
30    };
[51b7345]31
[d9a0e76]32    Type *resolveTypeof( Type *type, const SymTab::Indexer &indexer ) {
33        ResolveTypeof mutator( indexer );
34        return type->acceptMutator( mutator );
35    }
[51b7345]36
[d9a0e76]37    Type *ResolveTypeof::mutate( TypeofType *typeofType ) {
38#if 0
39        std::cout << "resolving typeof: ";
40        typeofType->print( std::cout );
41        std::cout << std::endl;
42#endif
43        if ( typeofType->get_expr() ) {
44            Expression *newExpr = resolveInVoidContext( typeofType->get_expr(), indexer );
45            assert( newExpr->get_results().size() > 0 );
46            Type *newType;
47            if ( newExpr->get_results().size() > 1 ) {
48                TupleType *tupleType = new TupleType( Type::Qualifiers() );
49                cloneAll( newExpr->get_results(), tupleType->get_types() );
50                newType = tupleType;
51            } else {
52                newType = newExpr->get_results().front()->clone();
53            }
54            delete typeofType;
55            return newType;
56        }
57        return typeofType;
[51b7345]58    }
59
60} // namespace ResolvExpr
Note: See TracBrowser for help on using the repository browser.