Check if the compiler supports std::filesystem#779
Conversation
std::filesystem
79b1b6a to
1db303a
Compare
5d802c5 to
d1f2830
Compare
a668fd6 to
81a91ed
Compare
|
This PR fails on GitHub during CI since we have /home/runner/work/occa/occa/src/c/device.cpp: In function ‘occaJson occaDeviceGetKernelProperties(occaDevice)’:
/home/runner/work/occa/occa/src/c/device.cpp:51:21: error: possibly dangling reference to a temporary [-Werror=dangling-reference]
51 | const occa::json &props = occa::c::device(device).kernelProperties();One option is to just remove diff --git a/include/occa/core/device.hpp b/include/occa/core/device.hpp
index b0461f23..4e1e8e5f 100644
--- a/include/occa/core/device.hpp
+++ b/include/occa/core/device.hpp
@@ -281,6 +281,7 @@ namespace occa {
* @endDoc
*/
const occa::json& properties() const;
+ const occa::json* propertiesPtr() const;
/**
* @startDoc{arch}
@@ -298,12 +299,15 @@ namespace occa {
const std::string& arch() const;
const occa::json& kernelProperties() const;
+ const occa::json* kernelPropertiesPtr() const;
occa::json kernelProperties(const occa::json &additionalProps) const;
const occa::json& memoryProperties() const;
+ const occa::json* memoryPropertiesPtr() const;
occa::json memoryProperties(const occa::json &additionalProps) const;
const occa::json& streamProperties() const;
+ const occa::json* streamPropertiesPtr() const;
occa::json streamProperties(const occa::json &additionalProps) const;
/**
diff --git a/src/core/device.cpp b/src/core/device.cpp
index 45fbdd42..f8dbb902 100644
--- a/src/core/device.cpp
+++ b/src/core/device.cpp
@@ -176,6 +176,11 @@ namespace occa {
return modeDevice->properties;
}
+ const occa::json* device::propertiesPtr() const {
+ assertInitialized();
+ return &(modeDevice->properties);
+ }
+
const std::string& device::arch() const {
static const std::string noArch = "No Arch";
return (modeDevice
@@ -188,6 +193,11 @@ namespace occa {
return (const occa::json&) modeDevice->properties["kernel"];
}
+ const occa::json* device::kernelPropertiesPtr() const {
+ assertInitialized();
+ return (const occa::json*) &(modeDevice->properties["kernel"]);
+ }
+
occa::json device::kernelProperties(const occa::json &additionalProps) const {
return (
kernelProperties()
@@ -200,6 +210,11 @@ namespace occa {
return (const occa::json&) modeDevice->properties["memory"];
}
+ const occa::json* device::memoryPropertiesPtr() const {
+ assertInitialized();
+ return (const occa::json*) &(modeDevice->properties["memory"]);
+ }
+
occa::json device::memoryProperties(const occa::json &additionalProps) const {
return (
memoryProperties()
@@ -212,6 +227,11 @@ namespace occa {
return (const occa::json&) modeDevice->properties["stream"];
}
+ const occa::json* device::streamPropertiesPtr() const {
+ assertInitialized();
+ return (const occa::json*) &(modeDevice->properties["stream"]);
+ }
+
occa::json device::streamProperties(const occa::json &additionalProps) const {
return (
streamProperties()
diff --git a/src/c/device.cpp b/src/c/device.cpp
index 475f3467..c424e1a8 100644
--- a/src/c/device.cpp
+++ b/src/c/device.cpp
@@ -39,8 +39,8 @@ const char* occaDeviceMode(occaDevice device) {
}
occaJson occaDeviceGetProperties(occaDevice device) {
- const occa::json &props = occa::c::device(device).properties();
- return occa::c::newOccaType(props, false);
+ const occa::json *props = occa::c::device(device).propertiesPtr();
+ return occa::c::newOccaType(*props, false);
}
const char* occaDeviceArch(occaDevice device) {
@@ -48,18 +48,18 @@ const char* occaDeviceArch(occaDevice device) {
}
occaJson occaDeviceGetKernelProperties(occaDevice device) {
- const occa::json &props = occa::c::device(device).kernelProperties();
- return occa::c::newOccaType(props, false);
+ const occa::json *props = occa::c::device(device).kernelPropertiesPtr();
+ return occa::c::newOccaType(*props, false);
}
occaJson occaDeviceGetMemoryProperties(occaDevice device) {
- const occa::json &props = occa::c::device(device).memoryProperties();
- return occa::c::newOccaType(props, false);
+ const occa::json *props = occa::c::device(device).memoryPropertiesPtr();
+ return occa::c::newOccaType(*props, false);
}
occaJson occaDeviceGetStreamProperties(occaDevice device) {
- const occa::json &props = occa::c::device(device).streamProperties();
- return occa::c::newOccaType(props, false);
+ const occa::json *props = occa::c::device(device).streamPropertiesPtr();
+ return occa::c::newOccaType(*props, false);
}
occaUDim_t occaDeviceMemorySize(occaDevice device) { |
|
It seems like pointers are the way to go, especially since the underlying C struct is storing the reference as a pointer anyway. |
81a91ed to
c25f2c6
Compare
Fixed in #783. Seems like the usage of pointers wasn't necessary as we could simply avoid using the temporary variable. |
c25f2c6 to
4e4027e
Compare
Description
We need
std::filesystemsupport in the CXX compiler in order to compile OCCA.Seems like some gcc versions even with
-std=c++17set doesn't supportstd::filesystem.