r202167 - Pretty Printer: Fix printing of conversion operator decls and calls.

Benjamin Kramer benny.kra at gmail.com
Tue Feb 25 10:11:56 PST 2014


On 25.02.2014, at 18:46, Rafael EspĂ­ndola <rafael.espindola at gmail.com> 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 <benny.kra at googlemail.com> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list