On 25.02.2014, at 18:46, Rafael EspĂndola <[email protected]> wrote:
> Sorry, this broke Analysis/auto-obj-dtors-cfg-output.cpp for me and I > reverted it in r202173. Thanks! Turns out when broken behavior is in the tree for a while it eventually gets tested by tests for completely unrelated features :( - Ben > > On 25 February 2014 12:26, Benjamin Kramer <[email protected]> wrote: >> Author: d0k >> Date: Tue Feb 25 11:26:26 2014 >> New Revision: 202167 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=202167&view=rev >> Log: >> Pretty Printer: Fix printing of conversion operator decls and calls. >> >> - Don't emit anything when we encounter a call to a conversion operator. >> "bar(a & b)" instead of "bar(a & b.operator int())" >> This preserves the semantics and is still idempotent if we print the AST >> multiple times. >> >> - Properly print declarations of conversion operators. >> "explicit operator bool();" instead of "bool operator _Bool();" >> >> PR18776. >> >> Modified: >> cfe/trunk/lib/AST/DeclPrinter.cpp >> cfe/trunk/lib/AST/DeclarationName.cpp >> cfe/trunk/lib/AST/StmtPrinter.cpp >> cfe/trunk/test/SemaCXX/ast-print.cpp >> >> Modified: cfe/trunk/lib/AST/DeclPrinter.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=202167&r1=202166&r2=202167&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/DeclPrinter.cpp (original) >> +++ cfe/trunk/lib/AST/DeclPrinter.cpp Tue Feb 25 11:26:26 2014 >> @@ -385,6 +385,7 @@ void DeclPrinter::VisitEnumConstantDecl( >> >> void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) { >> CXXConstructorDecl *CDecl = dyn_cast<CXXConstructorDecl>(D); >> + CXXConversionDecl *ConversionDecl = dyn_cast<CXXConversionDecl>(D); >> if (!Policy.SuppressSpecifiers) { >> switch (D->getStorageClass()) { >> case SC_None: break; >> @@ -398,7 +399,8 @@ void DeclPrinter::VisitFunctionDecl(Func >> if (D->isInlineSpecified()) Out << "inline "; >> if (D->isVirtualAsWritten()) Out << "virtual "; >> if (D->isModulePrivate()) Out << "__module_private__ "; >> - if (CDecl && CDecl->isExplicitSpecified()) >> + if ((CDecl && CDecl->isExplicitSpecified()) || >> + (ConversionDecl && ConversionDecl->isExplicit())) >> Out << "explicit "; >> } >> >> @@ -536,15 +538,15 @@ void DeclPrinter::VisitFunctionDecl(Func >> } >> Out << ")"; >> } >> - if (!Proto.empty()) >> - Out << Proto; >> - } else { >> + } else if (!ConversionDecl) { >> if (FT && FT->hasTrailingReturn()) { >> Out << "auto " << Proto << " -> "; >> Proto.clear(); >> } >> AFT->getReturnType().print(Out, Policy, Proto); >> + Proto.clear(); >> } >> + Out << Proto; >> } else { >> Ty.print(Out, Policy, Proto); >> } >> >> Modified: cfe/trunk/lib/AST/DeclarationName.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclarationName.cpp?rev=202167&r1=202166&r2=202167&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/DeclarationName.cpp (original) >> +++ cfe/trunk/lib/AST/DeclarationName.cpp Tue Feb 25 11:26:26 2014 >> @@ -191,6 +191,7 @@ raw_ostream &operator<<(raw_ostream &OS, >> return OS << *Rec->getDecl(); >> LangOptions LO; >> LO.CPlusPlus = true; >> + LO.Bool = true; >> return OS << Type.getAsString(PrintingPolicy(LO)); >> } >> case DeclarationName::CXXUsingDirective: >> @@ -546,6 +547,7 @@ void DeclarationNameInfo::printName(raw_ >> OS << "operator "; >> LangOptions LO; >> LO.CPlusPlus = true; >> + LO.Bool = true; >> OS << TInfo->getType().getAsString(PrintingPolicy(LO)); >> } else >> OS << Name; >> >> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=202167&r1=202166&r2=202167&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original) >> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Tue Feb 25 11:26:26 2014 >> @@ -1296,6 +1296,12 @@ void StmtPrinter::VisitCXXOperatorCallEx >> } >> >> void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { >> + // If we have a conversion operator call only print the argument. >> + CXXMethodDecl *MD = Node->getMethodDecl(); >> + if (MD && isa<CXXConversionDecl>(MD)) { >> + PrintExpr(Node->getImplicitObjectArgument()); >> + return; >> + } >> VisitCallExpr(cast<CallExpr>(Node)); >> } >> >> >> Modified: cfe/trunk/test/SemaCXX/ast-print.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ast-print.cpp?rev=202167&r1=202166&r2=202167&view=diff >> ============================================================================== >> --- cfe/trunk/test/SemaCXX/ast-print.cpp (original) >> +++ cfe/trunk/test/SemaCXX/ast-print.cpp Tue Feb 25 11:26:26 2014 >> @@ -1,4 +1,4 @@ >> -// RUN: %clang_cc1 -ast-print %s | FileCheck %s >> +// RUN: %clang_cc1 -ast-print %s -std=gnu++11 | FileCheck %s >> >> // CHECK: r; >> // CHECK-NEXT: (r->method()); >> @@ -173,3 +173,26 @@ void test14() { >> float test15() { >> return __builtin_asinf(1.0F); >> } >> + >> +namespace PR18776 { >> +struct A { >> + operator void *(); >> + explicit operator bool(); >> + A operator&(A); >> +}; >> + >> +// CHECK: struct A >> +// CHECK-NEXT: {{^[ ]*operator}} void *(); >> +// CHECK-NEXT: {{^[ ]*explicit}} operator bool(); >> + >> +void bar(void *); >> + >> +void foo() { >> + A a, b; >> + bar(a & b); >> +// CHECK: bar(a & b); >> + if (a & b) >> +// CHECK: if (a & b) >> + return; >> +} >> +}; >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
