diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -1484,7 +1484,7 @@ SourceLocation Loc; unsigned Scale; - /// \brief Construct an empty integer literal. + /// \brief Construct an empty fixed-point literal. explicit FixedPointLiteral(EmptyShell Empty) : Expr(FixedPointLiteralClass, Empty) {} @@ -1498,6 +1498,9 @@ QualType type, SourceLocation l, unsigned Scale); + /// Returns an empty fixed-point literal. + static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty); + SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } @@ -1506,6 +1509,9 @@ void setLocation(SourceLocation Location) { Loc = Location; } + unsigned getScale() const { return Scale; } + void setScale(unsigned S) { Scale = S; } + static bool classof(const Stmt *T) { return T->getStmtClass() == FixedPointLiteralClass; } diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -1887,6 +1887,9 @@ EXPR_COAWAIT, EXPR_COYIELD, EXPR_DEPENDENT_COAWAIT, + + // FixedPointLiteral + EXPR_FIXEDPOINT_LITERAL, }; /// The kinds of designators that can occur in a diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -913,6 +913,11 @@ return new (C) FixedPointLiteral(C, V, type, l, Scale); } +FixedPointLiteral *FixedPointLiteral::Create(const ASTContext &C, + EmptyShell Empty) { + return new (C) FixedPointLiteral(Empty); +} + std::string FixedPointLiteral::getValueAsString(unsigned Radix) const { // Currently the longest decimal number that can be printed is the max for an // unsigned long _Accum: 4294967295.99999999976716935634613037109375 diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -605,6 +605,7 @@ void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) { VisitExpr(E); E->setLocation(readSourceLocation()); + E->setScale(Record.readInt()); E->setValue(Record.getContext(), Record.readAPInt()); } @@ -2857,6 +2858,10 @@ S = IntegerLiteral::Create(Context, Empty); break; + case EXPR_FIXEDPOINT_LITERAL: + S = FixedPointLiteral::Create(Context, Empty); + break; + case EXPR_FLOATING_LITERAL: S = FloatingLiteral::Create(Context, Empty); break; diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -571,6 +571,7 @@ RECORD(EXPR_PREDEFINED); RECORD(EXPR_DECL_REF); RECORD(EXPR_INTEGER_LITERAL); + RECORD(EXPR_FIXEDPOINT_LITERAL); RECORD(EXPR_FLOATING_LITERAL); RECORD(EXPR_IMAGINARY_LITERAL); RECORD(EXPR_STRING_LITERAL); diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -629,8 +629,9 @@ void ASTStmtWriter::VisitFixedPointLiteral(FixedPointLiteral *E) { VisitExpr(E); Record.AddSourceLocation(E->getLocation()); + Record.push_back(E->getScale()); Record.AddAPInt(E->getValue()); - Code = serialization::EXPR_INTEGER_LITERAL; + Code = serialization::EXPR_FIXEDPOINT_LITERAL; } void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) { diff --git a/clang/test/PCH/Inputs/fixed-point-literal.h b/clang/test/PCH/Inputs/fixed-point-literal.h new file mode 100644 --- /dev/null +++ b/clang/test/PCH/Inputs/fixed-point-literal.h @@ -0,0 +1,5 @@ +// Header for PCH test fixed-point-literal.c + +const short _Fract sf = -0.25r; +const _Fract f = 0.75r; +const long _Accum la = 25.25lk; diff --git a/clang/test/PCH/fixed-point-literal.c b/clang/test/PCH/fixed-point-literal.c new file mode 100644 --- /dev/null +++ b/clang/test/PCH/fixed-point-literal.c @@ -0,0 +1,15 @@ + +// Test this without pch. +// RUN: %clang_cc1 -ffixed-point -include %S/Inputs/fixed-point-literal.h -fsyntax-only -ast-print -o - %s | FileCheck %s + +// Test with pch. +// RUN: %clang_cc1 -ffixed-point -emit-pch -o %t %S/Inputs/fixed-point-literal.h +// RUN: %clang_cc1 -ffixed-point -include-pch %t -fsyntax-only -ast-print -o - %s | FileCheck %s + +// CHECK: const short _Fract sf = -0.25r; +// CHECK: const _Fract f = 0.75r; +// CHECK: const long _Accum la = 25.25lk; + +short _Fract sf2 = sf; +_Fract f2 = f; +long _Accum la2 = la;