xref: /llvm-project/flang/lib/Semantics/attr.cpp (revision bcba39a56fd4e1debe3854d564c3e03bf0a50ee6)
164ab3302SCarolineConcatto //===-- lib/Semantics/attr.cpp --------------------------------------------===//
264ab3302SCarolineConcatto //
364ab3302SCarolineConcatto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
464ab3302SCarolineConcatto // See https://llvm.org/LICENSE.txt for license information.
564ab3302SCarolineConcatto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
664ab3302SCarolineConcatto //
764ab3302SCarolineConcatto //===----------------------------------------------------------------------===//
864ab3302SCarolineConcatto 
964ab3302SCarolineConcatto #include "flang/Semantics/attr.h"
1064ab3302SCarolineConcatto #include "flang/Common/idioms.h"
118670e499SCaroline Concatto #include "llvm/Support/raw_ostream.h"
1264ab3302SCarolineConcatto #include <stddef.h>
1364ab3302SCarolineConcatto 
1464ab3302SCarolineConcatto namespace Fortran::semantics {
1564ab3302SCarolineConcatto 
CheckValid(const Attrs & allowed) const1664ab3302SCarolineConcatto void Attrs::CheckValid(const Attrs &allowed) const {
1764ab3302SCarolineConcatto   if (!allowed.HasAll(*this)) {
1864ab3302SCarolineConcatto     common::die("invalid attribute");
1964ab3302SCarolineConcatto   }
2064ab3302SCarolineConcatto }
2164ab3302SCarolineConcatto 
AttrToString(Attr attr)2264ab3302SCarolineConcatto std::string AttrToString(Attr attr) {
2364ab3302SCarolineConcatto   switch (attr) {
241f879005STim Keith   case Attr::BIND_C:
251f879005STim Keith     return "BIND(C)";
261f879005STim Keith   case Attr::INTENT_IN:
271f879005STim Keith     return "INTENT(IN)";
281f879005STim Keith   case Attr::INTENT_INOUT:
291f879005STim Keith     return "INTENT(INOUT)";
301f879005STim Keith   case Attr::INTENT_OUT:
311f879005STim Keith     return "INTENT(OUT)";
321f879005STim Keith   default:
33*bcba39a5SPeter Klausler     return std::string{EnumToString(attr)};
3464ab3302SCarolineConcatto   }
3564ab3302SCarolineConcatto }
3664ab3302SCarolineConcatto 
operator <<(llvm::raw_ostream & o,Attr attr)378670e499SCaroline Concatto llvm::raw_ostream &operator<<(llvm::raw_ostream &o, Attr attr) {
3864ab3302SCarolineConcatto   return o << AttrToString(attr);
3964ab3302SCarolineConcatto }
4064ab3302SCarolineConcatto 
operator <<(llvm::raw_ostream & o,const Attrs & attrs)418670e499SCaroline Concatto llvm::raw_ostream &operator<<(llvm::raw_ostream &o, const Attrs &attrs) {
4264ab3302SCarolineConcatto   std::size_t n{attrs.count()};
4364ab3302SCarolineConcatto   std::size_t seen{0};
4464ab3302SCarolineConcatto   for (std::size_t j{0}; seen < n; ++j) {
4564ab3302SCarolineConcatto     Attr attr{static_cast<Attr>(j)};
4664ab3302SCarolineConcatto     if (attrs.test(attr)) {
4764ab3302SCarolineConcatto       if (seen > 0) {
4864ab3302SCarolineConcatto         o << ", ";
4964ab3302SCarolineConcatto       }
5064ab3302SCarolineConcatto       o << attr;
5164ab3302SCarolineConcatto       ++seen;
5264ab3302SCarolineConcatto     }
5364ab3302SCarolineConcatto   }
5464ab3302SCarolineConcatto   return o;
5564ab3302SCarolineConcatto }
561f879005STim Keith } // namespace Fortran::semantics
57