Author: majnemer Date: Sun Mar 27 22:19:50 2016 New Revision: 264562 URL: http://llvm.org/viewvc/llvm-project?rev=264562&view=rev Log: Fix serialization/deserialization for __uuidof
I broke this back in r264529 because I forgot to serialize the UuidAttr member. Fix this by replacing the UuidAttr with a StringRef which is properly serialized and deserialized. Added: cfe/trunk/test/PCH/uuidof.cpp Modified: cfe/trunk/include/clang/AST/ExprCXX.h cfe/trunk/lib/AST/ExprCXX.cpp cfe/trunk/lib/AST/MicrosoftMangle.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp cfe/trunk/lib/Serialization/ASTReaderStmt.cpp cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Modified: cfe/trunk/include/clang/AST/ExprCXX.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/ExprCXX.h (original) +++ cfe/trunk/include/clang/AST/ExprCXX.h Sun Mar 27 22:19:50 2016 @@ -778,23 +778,23 @@ public: class CXXUuidofExpr : public Expr { private: llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand; - const UuidAttr *UA; + StringRef UuidStr; SourceRange Range; public: - CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, const UuidAttr *UA, + CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, StringRef UuidStr, SourceRange R) : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false, Operand->getType()->isDependentType(), Operand->getType()->isInstantiationDependentType(), Operand->getType()->containsUnexpandedParameterPack()), - Operand(Operand), UA(UA), Range(R) {} + Operand(Operand), UuidStr(UuidStr), Range(R) {} - CXXUuidofExpr(QualType Ty, Expr *Operand, const UuidAttr *UA, SourceRange R) + CXXUuidofExpr(QualType Ty, Expr *Operand, StringRef UuidStr, SourceRange R) : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false, Operand->isTypeDependent(), Operand->isInstantiationDependent(), Operand->containsUnexpandedParameterPack()), - Operand(Operand), UA(UA), Range(R) {} + Operand(Operand), UuidStr(UuidStr), Range(R) {} CXXUuidofExpr(EmptyShell Empty, bool isExpr) : Expr(CXXUuidofExprClass, Empty) { @@ -831,7 +831,8 @@ public: Operand = E; } - StringRef getUuidAsStringRef() const; + void setUuidStr(StringRef US) { UuidStr = US; } + StringRef getUuidStr() const { return UuidStr; } SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } Modified: cfe/trunk/lib/AST/ExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/lib/AST/ExprCXX.cpp (original) +++ cfe/trunk/lib/AST/ExprCXX.cpp Sun Mar 27 22:19:50 2016 @@ -54,10 +54,6 @@ QualType CXXUuidofExpr::getTypeOperand(A Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals); } -StringRef CXXUuidofExpr::getUuidAsStringRef() const { - return UA ? UA->getGuid() : "00000000-0000-0000-0000-000000000000"; -} - // CXXScalarValueInitExpr SourceLocation CXXScalarValueInitExpr::getLocStart() const { return TypeInfo ? TypeInfo->getTypeLoc().getBeginLoc() : RParenLoc; Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original) +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Sun Mar 27 22:19:50 2016 @@ -1186,7 +1186,7 @@ void MicrosoftCXXNameMangler::mangleExpr // This CXXUuidofExpr is mangled as-if it were actually a VarDecl from // const __s_GUID _GUID_{lower case UUID with underscores} - StringRef Uuid = UE->getUuidAsStringRef(); + StringRef Uuid = UE->getUuidStr(); std::string Name = "_GUID_" + Uuid.lower(); std::replace(Name.begin(), Name.end(), '-', '_'); Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sun Mar 27 22:19:50 2016 @@ -1454,7 +1454,7 @@ ConstantAddress CodeGenModule::GetAddrOf const CXXUuidofExpr* E) { // Sema has verified that IIDSource has a __declspec(uuid()), and that its // well-formed. - StringRef Uuid = E->getUuidAsStringRef(); + StringRef Uuid = E->getUuidStr(); std::string Name = "_GUID_" + Uuid.lower(); std::replace(Name.begin(), Name.end(), '-', '_'); Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sun Mar 27 22:19:50 2016 @@ -550,7 +550,7 @@ ExprResult Sema::BuildCXXUuidof(QualType SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc) { - const UuidAttr *UA = nullptr; + StringRef UuidStr; if (!Operand->getType()->isDependentType()) { llvm::SmallSetVector<const UuidAttr *, 1> UuidAttrs; getUuidAttrOfType(*this, Operand->getType(), UuidAttrs); @@ -558,10 +558,10 @@ ExprResult Sema::BuildCXXUuidof(QualType return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid)); if (UuidAttrs.size() > 1) return ExprError(Diag(TypeidLoc, diag::err_uuidof_with_multiple_guids)); - UA = UuidAttrs.back(); + UuidStr = UuidAttrs.back()->getGuid(); } - return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), Operand, UA, + return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), Operand, UuidStr, SourceRange(TypeidLoc, RParenLoc)); } @@ -570,20 +570,22 @@ ExprResult Sema::BuildCXXUuidof(QualType SourceLocation TypeidLoc, Expr *E, SourceLocation RParenLoc) { - const UuidAttr *UA = nullptr; + StringRef UuidStr; if (!E->getType()->isDependentType()) { - if (!E->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) { + if (E->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) { + UuidStr = "00000000-0000-0000-0000-000000000000"; + } else { llvm::SmallSetVector<const UuidAttr *, 1> UuidAttrs; getUuidAttrOfType(*this, E->getType(), UuidAttrs); if (UuidAttrs.empty()) return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid)); if (UuidAttrs.size() > 1) return ExprError(Diag(TypeidLoc, diag::err_uuidof_with_multiple_guids)); - UA = UuidAttrs.back(); + UuidStr = UuidAttrs.back()->getGuid(); } } - return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), E, UA, + return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), E, UuidStr, SourceRange(TypeidLoc, RParenLoc)); } Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Sun Mar 27 22:19:50 2016 @@ -1680,6 +1680,8 @@ void ASTStmtReader::VisitMSPropertySubsc void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { VisitExpr(E); E->setSourceRange(ReadSourceRange(Record, Idx)); + std::string UuidStr = ReadString(Record, Idx); + E->setUuidStr(StringRef(UuidStr).copy(Reader.getContext())); if (E->isTypeOperand()) { // __uuidof(ComType) E->setTypeOperandSourceInfo( GetTypeSourceInfo(Record, Idx)); Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=264562&r1=264561&r2=264562&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Sun Mar 27 22:19:50 2016 @@ -1701,6 +1701,7 @@ void ASTStmtWriter::VisitMSPropertySubsc void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) { VisitExpr(E); Writer.AddSourceRange(E->getSourceRange(), Record); + Writer.AddString(E->getUuidStr(), Record); if (E->isTypeOperand()) { Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record); Code = serialization::EXPR_CXX_UUIDOF_TYPE; Added: cfe/trunk/test/PCH/uuidof.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/uuidof.cpp?rev=264562&view=auto ============================================================================== --- cfe/trunk/test/PCH/uuidof.cpp (added) +++ cfe/trunk/test/PCH/uuidof.cpp Sun Mar 27 22:19:50 2016 @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fms-extensions -x c++-header -emit-pch -o %t %s +// RUN: %clang_cc1 -fms-extensions -include-pch %t -fsyntax-only %s -emit-llvm -o - | FileCheck %s + +#ifndef HEADER +#define HEADER +struct _GUID {}; +const _GUID &x = __uuidof(0); +// CHECK-DAG: @_GUID_00000000_0000_0000_0000_000000000000 +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits