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) const1664ab3302SCarolineConcattovoid Attrs::CheckValid(const Attrs &allowed) const { 1764ab3302SCarolineConcatto if (!allowed.HasAll(*this)) { 1864ab3302SCarolineConcatto common::die("invalid attribute"); 1964ab3302SCarolineConcatto } 2064ab3302SCarolineConcatto } 2164ab3302SCarolineConcatto AttrToString(Attr attr)2264ab3302SCarolineConcattostd::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 Concattollvm::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 Concattollvm::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