@@ -4210,26 +4210,45 @@ class AbstractConditionalOperator : public Expr {
42104210
42114211// / ConditionalOperator - The ?: ternary operator. The GNU "missing
42124212// / middle" extension is a BinaryConditionalOperator.
4213- class ConditionalOperator : public AbstractConditionalOperator {
4213+ class ConditionalOperator final
4214+ : public AbstractConditionalOperator,
4215+ private llvm::TrailingObjects<ConditionalOperator, FPOptionsOverride> {
42144216 enum { COND, LHS, RHS, END_EXPR };
42154217 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
42164218
42174219 friend class ASTStmtReader ;
4218- public:
4220+
42194221 ConditionalOperator (Expr *cond, SourceLocation QLoc, Expr *lhs,
42204222 SourceLocation CLoc, Expr *rhs, QualType t,
4221- ExprValueKind VK, ExprObjectKind OK)
4223+ ExprValueKind VK, ExprObjectKind OK,
4224+ FPOptionsOverride FPFeatures)
42224225 : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, QLoc,
42234226 CLoc) {
42244227 SubExprs[COND] = cond;
42254228 SubExprs[LHS] = lhs;
42264229 SubExprs[RHS] = rhs;
4230+ ConditionalOperatorBits.HasFPFeatures =
4231+ FPFeatures.requiresTrailingStorage ();
4232+ if (hasStoredFPFeatures ())
4233+ setStoredFPFeatures (FPFeatures);
42274234 setDependence (computeDependence (this ));
42284235 }
42294236
42304237 // / Build an empty conditional operator.
4231- explicit ConditionalOperator (EmptyShell Empty)
4232- : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { }
4238+ ConditionalOperator (EmptyShell Empty, bool HasFPFeatures)
4239+ : AbstractConditionalOperator(ConditionalOperatorClass, Empty) {
4240+ ConditionalOperatorBits.HasFPFeatures = HasFPFeatures;
4241+ }
4242+
4243+ public:
4244+ static ConditionalOperator *CreateEmpty (const ASTContext &C, EmptyShell Empty,
4245+ bool HasFPFeatures);
4246+
4247+ static ConditionalOperator *Create (const ASTContext &C, Expr *cond,
4248+ SourceLocation QLoc, Expr *lhs,
4249+ SourceLocation CLoc, Expr *rhs, QualType t,
4250+ ExprValueKind VK, ExprObjectKind OK,
4251+ FPOptionsOverride FPFeatures);
42334252
42344253 // / getCond - Return the expression representing the condition for
42354254 // / the ?: operator.
@@ -4265,6 +4284,44 @@ class ConditionalOperator : public AbstractConditionalOperator {
42654284 const_child_range children () const {
42664285 return const_child_range (&SubExprs[0 ], &SubExprs[0 ] + END_EXPR);
42674286 }
4287+
4288+ // / Is FPFeatures in trailing storage?
4289+ bool hasStoredFPFeatures () const {
4290+ return ConditionalOperatorBits.HasFPFeatures ;
4291+ }
4292+ // / Get FPFeatures from trailing storage.
4293+ FPOptionsOverride getStoredFPFeatures () const {
4294+ return *getTrailingFPFeatures ();
4295+ }
4296+
4297+ // Get the FP features status of this operator. Only meaningful for
4298+ // operations on floating point types.
4299+ FPOptions getFPFeaturesInEffect (const LangOptions &LO) const {
4300+ if (hasStoredFPFeatures ())
4301+ return getStoredFPFeatures ().applyOverrides (LO);
4302+ return FPOptions::defaultWithoutTrailingStorage (LO);
4303+ }
4304+ FPOptionsOverride getFPFeatures () const {
4305+ return hasStoredFPFeatures () ? getStoredFPFeatures () : FPOptionsOverride ();
4306+ }
4307+
4308+ private:
4309+ // / Set FPFeatures in trailing storage, used only by Serialization.
4310+ void setStoredFPFeatures (FPOptionsOverride F) {
4311+ *getTrailingFPFeatures () = F;
4312+ }
4313+
4314+ FPOptionsOverride *getTrailingFPFeatures () {
4315+ assert (ConditionalOperatorBits.HasFPFeatures );
4316+ return getTrailingObjects<FPOptionsOverride>();
4317+ }
4318+
4319+ const FPOptionsOverride *getTrailingFPFeatures () const {
4320+ assert (ConditionalOperatorBits.HasFPFeatures );
4321+ return getTrailingObjects<FPOptionsOverride>();
4322+ }
4323+
4324+ friend class TrailingObjects ;
42684325};
42694326
42704327// / BinaryConditionalOperator - The GNU extension to the conditional
0 commit comments