summaryrefslogtreecommitdiff
path: root/lib/Sema/DeclSpec.cpp
blob: 2374e19c7b3fe61b44875ebb05816f41d284b063 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//===-- DeclSpec.cpp - Fortran Declaration Type Specifier Interface ---===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// The Fortran declaration type specifier interface.
//
//===----------------------------------------------------------------------===//

#include "flang/Sema/DeclSpec.h"
#include "flang/AST/Expr.h"
#include "flang/AST/Type.h"
#include "llvm/ADT/ArrayRef.h"

namespace flang {

DeclSpec::~DeclSpec() {}

const char *DeclSpec::getSpecifierName(DeclSpec::TST I) {
  switch (I) {
  case TST_unspecified:     return "unspecified";
  case TST_integer:         return "INTEGER";
  case TST_real:            return "REAL";
  case TST_complex:         return "COMPLEX";
  case TST_character:       return "CHARACTER";
  case TST_logical:         return "LOGICAL";
  case TST_struct:          return "TYPE";
  }
  llvm_unreachable("Unknown typespec!");
}

const char *DeclSpec::getSpecifierName(DeclSpec::AS A) {
  switch (A) {
  case AS_unspecified:  return "unspecified";
  case AS_allocatable:  return "allocate";
  case AS_asynchronous: return "asynchronous";
  case AS_codimension:  return "codimension";
  case AS_contiguous:   return "contiguous";
  case AS_dimension:    return "dimension";
  case AS_external:     return "external";
  case AS_intrinsic:    return "intrinsic";
  case AS_optional:     return "optinonal";
  case AS_parameter:    return "parameter";
  case AS_pointer:      return "pointer";
  case AS_protected:    return "protected";
  case AS_save:         return "save";
  case AS_target:       return "target";
  case AS_value:        return "value";
  case AS_volatile:     return "volatile";
  }
  llvm_unreachable("Unknown typespec!");
}

const char *DeclSpec::getSpecifierName(DeclSpec::IS I) {
  switch (I) {
  case IS_unspecified: return "unspecified";
  case IS_in:          return "in";
  case IS_out:         return "out";
  case IS_inout:       return "inout";
  }
  llvm_unreachable("Unknown typespec!");
}

const char *DeclSpec::getSpecifierName(DeclSpec::AC I) {
  switch (I) {
  case AC_unspecified: return "unspecified";
  case AC_public:      return "public";
  case AC_private:     return "private";
  }
  llvm_unreachable("Unknown typespec!");
}

void DeclSpec::setDimensions(ArrayRef<ArraySpec *> Dims) {
  assert(hasAttributeSpec(AS_dimension) &&
         "Adding dimensions to a non-array declspec!");
  Dimensions.reserve(Dims.size());
  for (ArrayRef<ArraySpec*>::iterator
         I = Dims.begin(), E = Dims.end(); I != E; ++I)
    Dimensions.push_back(*I);
}

} //namespace flang