diff --git a/flang/include/flang/Optimizer/Dialect/FIRTypes.td b/flang/include/flang/Optimizer/Dialect/FIRTypes.td --- a/flang/include/flang/Optimizer/Dialect/FIRTypes.td +++ b/flang/include/flang/Optimizer/Dialect/FIRTypes.td @@ -211,6 +211,10 @@ return Base::get(elementType.getContext(), elementType); }]>, ]; + + let extraClassDeclaration = [{ + mlir::Type getElementType() const { return getEleTy(); } + }]; } def fir_IntegerType : FIR_Type<"Integer", "int"> { @@ -275,6 +279,10 @@ return Base::get(elementType.getContext(), elementType); }]>, ]; + + let extraClassDeclaration = [{ + mlir::Type getElementType() const { return getEleTy(); } + }]; } def fir_PointerType : FIR_Type<"Pointer", "ptr"> { diff --git a/flang/include/flang/Tools/PointerModels.h b/flang/include/flang/Tools/PointerModels.h --- a/flang/include/flang/Tools/PointerModels.h +++ b/flang/include/flang/Tools/PointerModels.h @@ -9,25 +9,27 @@ #ifndef FORTRAN_TOOLS_POINTER_MODELS_H #define FORTRAN_TOOLS_POINTER_MODELS_H +#include "mlir/Dialect/OpenACC/OpenACC.h" #include "mlir/Dialect/OpenMP/OpenMPDialect.h" -/// models for FIR pointer like types that already provide a `getElementType` or -/// a `getEleTy` method +/// models for FIR pointer like types that already provide a `getElementType` +/// method template -struct PointerLikeModel - : public mlir::omp::PointerLikeType::ExternalModel, T> { +struct OpenMPPointerLikeModel + : public mlir::omp::PointerLikeType::ExternalModel< + OpenMPPointerLikeModel, T> { mlir::Type getElementType(mlir::Type pointer) const { return pointer.cast().getElementType(); } }; template -struct AlternativePointerLikeModel - : public mlir::omp::PointerLikeType::ExternalModel< - AlternativePointerLikeModel, T> { +struct OpenACCPointerLikeModel + : public mlir::acc::PointerLikeType::ExternalModel< + OpenACCPointerLikeModel, T> { mlir::Type getElementType(mlir::Type pointer) const { - return pointer.cast().getEleTy(); + return pointer.cast().getElementType(); } }; diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp --- a/flang/lib/Optimizer/Dialect/FIRType.cpp +++ b/flang/lib/Optimizer/Dialect/FIRType.cpp @@ -1131,15 +1131,23 @@ LogicalType, LLVMPointerType, PointerType, RealType, RecordType, ReferenceType, SequenceType, ShapeType, ShapeShiftType, ShiftType, SliceType, TypeDescType, fir::VectorType>(); - fir::ReferenceType::attachInterface>( - *getContext()); + fir::ReferenceType::attachInterface< + OpenMPPointerLikeModel>(*getContext()); + fir::ReferenceType::attachInterface< + OpenACCPointerLikeModel>(*getContext()); - fir::PointerType::attachInterface>( + fir::PointerType::attachInterface>( + *getContext()); + fir::PointerType::attachInterface>( *getContext()); - fir::HeapType::attachInterface>( + fir::HeapType::attachInterface>( + *getContext()); + fir::HeapType::attachInterface>( *getContext()); fir::LLVMPointerType::attachInterface< - AlternativePointerLikeModel>(*getContext()); + OpenMPPointerLikeModel>(*getContext()); + fir::LLVMPointerType::attachInterface< + OpenACCPointerLikeModel>(*getContext()); }