Mercurial > projects > ldc
view gen/cl_helpers.h @ 1168:ab186e535e72
A different fix to #218 and DMD2682 that does not lead to constant folding regressions.
Fixes run/const_15, run/c/const_16_B.
The price is removing the lvalueness of struct literals. If it turns out too
much code depends on this behavior or we don't want to break with DMD, we
could keep struct literals as lvalues and instead convert struct literals used
as expression initializers into struct initializers.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 29 Mar 2009 11:43:45 +0200 |
parents | a8cb25d478c4 |
children | cc1efa23030a |
line wrap: on
line source
#ifndef LDC_CL_HELPERS_H #define LDC_CL_HELPERS_H #include <string> #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" struct Array; namespace opts { namespace cl = llvm::cl; /// Helper class for fancier options class FlagParser : public cl::parser<bool> { std::vector<std::pair<std::string, bool> > switches; public: template <class Opt> void initialize(Opt &O) { assert(!(O.getMiscFlags() & cl::AllowInverse) && "FlagParser doesn't support redundant AllowInverse flag"); std::string Name = O.ArgStr; switches.push_back(make_pair("enable-" + Name, true)); switches.push_back(make_pair("disable-" + Name, false)); // Replace <foo> with -enable-<foo> O.ArgStr = switches[0].first.c_str(); } bool parse(cl::Option &O, const char *ArgName, const std::string &ArgValue, bool &Val); void getExtraOptionNames(std::vector<const char*> &Names); }; /// Helper class for options that set multiple flags class MultiSetter { std::vector<bool*> locations; bool invert; MultiSetter(bool); //not implemented, disable auto-conversion public: MultiSetter(bool invert, bool* p, ...) END_WITH_NULL; void operator=(bool val); }; /// Helper class to fill Array with char* when given strings /// (Errors on empty strings) class ArrayAdapter { const char* name; Array** arrp; public: ArrayAdapter(const char* name_, Array*& arr) { name = name_; arrp = &arr; assert(name); assert(arrp); } void push_back(const char* cstr); void push_back(const std::string& str) { push_back(str.c_str()); } }; } #endif