source: translator/ResolvExpr/ResolveTypeof.cc @ 0b8cd722

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 0b8cd722 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
Line 
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 {
10    namespace {
11#if 0
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        }
20#endif
21    }
22
23    class ResolveTypeof : public Mutator {
24      public:
25        ResolveTypeof( const SymTab::Indexer &indexer ) : indexer( indexer ) {}
26        Type *mutate( TypeofType *typeofType );
27
28      private:
29        const SymTab::Indexer &indexer;
30    };
31
32    Type *resolveTypeof( Type *type, const SymTab::Indexer &indexer ) {
33        ResolveTypeof mutator( indexer );
34        return type->acceptMutator( mutator );
35    }
36
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;
58    }
59
60} // namespace ResolvExpr
Note: See TracBrowser for help on using the repository browser.