source: src/SynTree/AddressExpr.cc @ bf4b4cf

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since bf4b4cf was bf4b4cf, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Remove argName from Expression.

If named arguments are ever considered again, they should be added in UntypedExpr? (and maybe also ApplicationExpr?) to avoid unnecessary fields in every Expression. Like designators on initializers, it should be much easier to work with argument names at the call expression level.

  • Property mode set to 100644
File size: 2.7 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// AddressExpr.cc --
8//
9// Author           : Richard C. Bilson
10// Created On       : Sun May 17 23:54:44 2015
11// Last Modified By : Rob Schluntz
12// Last Modified On : Tue Apr 26 12:35:13 2016
13// Update Count     : 6
14//
15
16#include <ostream>           // for ostream, operator<<, basic_ostream, endl
17#include <string>            // for operator<<, string
18
19#include "Common/utility.h"  // for maybeClone
20#include "Expression.h"      // for AddressExpr, Expression
21#include "Type.h"            // for PointerType, Type, Type::Qualifiers
22
23// Address expressions are typed based on the following inference rules:
24//    E : lvalue T  &..& (n references)
25//   &E :        T *&..& (n references)
26//
27//    E : T  &..&        (m references)
28//   &E : T *&..&        (m-1 references)
29//
30// That is, lvalues becomes
31
32namespace {
33        Type * addrType( Type * type ) {
34                if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( type ) ) {
35                        return new ReferenceType( refType->get_qualifiers(), addrType( refType->get_base() ) );
36                } else {
37                        return new PointerType( Type::Qualifiers(), type->clone() );
38                }
39        }
40}
41
42AddressExpr::AddressExpr( Expression *arg ) : Expression(), arg( arg ) {
43        if ( arg->has_result() ) {
44                if ( arg->get_result()->get_lvalue() ) {
45                        // lvalue, retains all layers of reference and gains a pointer inside the references
46                        set_result( addrType( arg->get_result() ) );
47                } else {
48                        // taking address of non-lvalue -- must be a reference, loses one layer of reference
49                        ReferenceType * refType = strict_dynamic_cast< ReferenceType * >( arg->get_result() );
50                        set_result( addrType( refType->get_base() ) );
51                }
52                // result of & is never an lvalue
53                get_result()->set_lvalue( false );
54        }
55}
56
57AddressExpr::AddressExpr( const AddressExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
58}
59
60AddressExpr::~AddressExpr() {
61        delete arg;
62}
63
64void AddressExpr::print( std::ostream &os, Indenter indent ) const {
65        os << "Address of:" << std::endl;
66        if ( arg ) {
67                os << indent+1;
68                arg->print( os, indent+1 );
69        } // if
70}
71
72LabelAddressExpr::LabelAddressExpr( const Label &arg ) : arg( arg ) {
73        // label address always has type void *
74        result = new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) );
75}
76LabelAddressExpr::LabelAddressExpr( const LabelAddressExpr & other ) : Expression( other ), arg( other.arg ) {}
77LabelAddressExpr::~LabelAddressExpr() {}
78
79void LabelAddressExpr::print( std::ostream & os, Indenter ) const {
80        os << "Address of label:" << arg;
81}
82
83// Local Variables: //
84// tab-width: 4 //
85// mode: c++ //
86// compile-command: "make install" //
87// End: //
Note: See TracBrowser for help on using the repository browser.