Write a C++ constant of an allocating type as const, not constexpr [patch] - #143
Merged
Merged
Conversation
…texpr A constant string field came out as static/inline constexpr std::string, which compiles only while the value fits libstdc++'s small-string buffer and never under C++17. A constant whose type is std::string, std::vector, std::map or std::any is now inline const (inline static const in a type); literal types, pointers, references and caller-defined types keep constexpr. Fixes #101 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HsaGezbczZSL9fXfQafs7x
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Fixes #101
What was wrong
CppGeneratorwroteconstexpron every constant field, whatever its type. That happened in two places:SpellStorageforFieldDeclaration, andGenerateFieldfor a constantVariableDeclarationclass member.stringmaps tostd::string, so the output wasstatic constexpr std::string/inline constexpr std::string. That compiles only while the value fits libstdc++'s small-string buffer. A longer value fails in g++ 13 with "not a constant expression because it refers to a result of 'operator new'", and under C++17 it is never valid.Change
IsLiteralTypecheck covers the standard-library types the generator emits that allocate:std::string,std::vector,std::mapandstd::any.inline constat namespace scopeinline static constinside a typeconstexpras before:holo::reflect::FieldInfoTests
CppGeneratedSourceCompilesTests.ALongConstantStringCompilesWhereverAConstantMayStandcompiles a constant longer than the small-string buffer with the real C++ compiler, with-std=c++20 -pedantic. It covers three positions: namespace scope, a static field in a struct, and a class-memberVariableDeclaration.CppGeneratorTests.ConstantField_OfANonLiteralType_IsConstRatherThanConstexprpins the spellings, and checks thatintkeepsconstexpr.🤖 Generated with Claude Code
https://claude.ai/code/session_01HsaGezbczZSL9fXfQafs7x
Generated by Claude Code