Re: Implict casts disappeared from syntactic init list expressions in C++

2015-08-29 Thread Abramo Bagnara via cfe-commits
Il 28/08/2015 23:27, Richard Smith ha scritto:
> On Tue, Aug 25, 2015 at 10:27 AM, Abramo Bagnara
> mailto:abramo.bagn...@bugseng.com>> wrote:
> 
> Comparing the result of InitListExpr::getSyntacticForm between r224986
> and r245836 I've discovered that integer to char implicit cast for
> integer literal 3 is no longer added to AST for C++ (while it is present
> in C).
> 
> This is the source used to test:
> 
> char v[10] = { 3 };
> 
> Taken in account that:
> 
> - implicit cast (and other conversions, constructor calls, etc.) are
> very important also for who need to visit the syntactic form (obvious in
> *both* C and C++)
> 
> - to generate that for the syntactic form permit to increase the
> efficiency and the sharing when using designated range extensions (as
> the conversion chain don't need to be replicated for each entry)
> 
> I think it is a regression. Am I missing something?
> 
> 
> Why do you expect this semantic information to appear in the syntactic
> form of the initializer? 

Compare:

int x = 2.0;

with

struct s {
  int x;
} v = { .x = 2.0 };

For first declaration I have non-syntactic nodes (namely
ImplicitCastExpr) along with syntactic nodes, while for the second I
don't have that (for C++). This is an obstacle to write semi-syntactic
checkers that aims to find e.g. implicit cast from double to int in its
syntactic context.
Note that although we might visit the semantic form, we'll lose the
designators (not present in semantic form).

To resume, the reason why I would expect that are:

1) this is how it always has worked for C (and fortunately still works
this way)


2) this is how it always has worked (although partially, there was some
bugs) for C++. In past we have had patches to fix the areas where this
invariant was not respected (see commit 3146766
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20111212/050339.html
as an example).

This behavior has changed rather recently (if you think it is useful I
can find the commit that has removed the implicit casts from syntactic
form in C++)

Before such commit(s) the only bug I was aware where AST was missing
conversion chain was the following:

struct R2 {
  R2(int) {
  }
};
R2 v2[] = { 1.0 };


3) this way it would be congruent with other areas of AST where we have
non-syntactic nodes along with syntactic ones


4) it would permit to share more nodes in semantic form (and avoid to
rebuild many times the same conversion chain).

Looking at following typescript you can observe that ImplicitCastExpr is
shared only for C, but not for C++. I've initialized only two entries,
but it might be 1000 or 1000.

$ cat p.c
int x[100] = { [0 ... 1] = 3.0 };
$ clang-3.8 -cc1 -ast-dump -x c p.c
TranslationUnitDecl 0x272de40 <> 
|-TypedefDecl 0x272e338 <>  implicit
__int128_t '__int128'
|-TypedefDecl 0x272e398 <>  implicit
__uint128_t 'unsigned __int128'
|-TypedefDecl 0x272e648 <>  implicit
__builtin_va_list 'struct __va_list_tag [1]'
`-VarDecl 0x272e718  col:5 x 'int [100]' cinit
  `-InitListExpr 0x272e8b0  'int [100]'
|-array filler
| `-ImplicitValueInitExpr 0x272e918 <> 'int'
|-ImplicitCastExpr 0x272e900  'int' 
| `-FloatingLiteral 0x272e7f8  'double' 3.00e+00
`-ImplicitCastExpr 0x272e900  'int' 
  `-FloatingLiteral 0x272e7f8  'double' 3.00e+00
$ clang-3.8 -cc1 -ast-dump -x c++ p.c
TranslationUnitDecl 0x3300e60 <> 
|-TypedefDecl 0x3301398 <>  implicit
__int128_t '__int128'
|-TypedefDecl 0x33013f8 <>  implicit
__uint128_t 'unsigned __int128'
|-TypedefDecl 0x3301718 <>  implicit
__builtin_va_list 'struct __va_list_tag [1]'
`-VarDecl 0x33017e8  col:5 x 'int [100]' cinit
  `-InitListExpr 0x3301980  'int [100]'
|-array filler
| `-ImplicitValueInitExpr 0x3301a00 <> 'int'
|-ImplicitCastExpr 0x33019d0  'int' 
| `-FloatingLiteral 0x33018c8  'double' 3.00e+00
`-ImplicitCastExpr 0x33019e8  'int' 
  `-FloatingLiteral 0x33018c8  'double' 3.00e+00


5) if we would visit semantic form in a checker searching for implicit
cast from float to int in the C source above we'll find *two* of them,
while syntactically we have only one. This means that we should be
forced do some dirty tricks to avoid double reporting.

-- 
Abramo Bagnara

BUGSENG srl - http://bugseng.com
mailto:abramo.bagn...@bugseng.com
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r246359 - [AST] Don't crash when comparing incomplete object

2015-08-29 Thread David Majnemer via cfe-commits
Author: majnemer
Date: Sat Aug 29 03:32:55 2015
New Revision: 246359

URL: http://llvm.org/viewvc/llvm-project?rev=246359&view=rev
Log:
[AST] Don't crash when comparing incomplete object

We cannot tell if an object is past-the-end if its type is incomplete.
Zero sized objects satisfy past-the-end criteria and our object might
turn out to be such an object.

This fixes PR24622.

Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/Sema/const-eval.c

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=246359&r1=246358&r2=246359&view=diff
==
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Sat Aug 29 03:32:55 2015
@@ -6602,9 +6602,15 @@ static bool isOnePastTheEndOfCompleteObj
   !LV.getLValueDesignator().isOnePastTheEnd())
 return false;
 
+  // A pointer to an incomplete type might be past-the-end if the type's size 
is
+  // zero.  We cannot tell because the type is incomplete.
+  QualType Ty = getType(LV.getLValueBase());
+  if (Ty->isIncompleteType())
+return true;
+
   // We're a past-the-end pointer if we point to the byte after the object,
   // no matter what our type or path is.
-  auto Size = Ctx.getTypeSizeInChars(getType(LV.getLValueBase()));
+  auto Size = Ctx.getTypeSizeInChars(Ty);
   return LV.getLValueOffset() == Size;
 }
 

Modified: cfe/trunk/test/Sema/const-eval.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/const-eval.c?rev=246359&r1=246358&r2=246359&view=diff
==
--- cfe/trunk/test/Sema/const-eval.c (original)
+++ cfe/trunk/test/Sema/const-eval.c Sat Aug 29 03:32:55 2015
@@ -133,3 +133,7 @@ EVAL_EXPR(51, 0 != (float)1e99)
 
 // PR21945
 void PR21945() { int i = (({}), 0l); }
+
+void PR24622();
+struct PR24622 {} pr24622;
+EVAL_EXPR(52, &pr24622 == (void *)&PR24622); // expected-error {{must have a 
constant size}}


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] fix parentheses location in a CXXConstructExpr

2015-08-29 Thread Olivier Goffart via cfe-commits
Hi,

Please review the attached patch.

In Sema::BuildCXXFunctionalCastExpr, if the class has a destructor, the 
Op.SrcExpr might be a CXXBindTemporaryExpr which we need to unwrap.

In the testcase, the first new CHECK worked (because A does not have a 
destructor),  but the second CHECK failed (did not include the last 
parenthese) because D has a destructor.

I used dyn_cast_or_null just to be safe, becasue i don't know if it is 
possible for the BindExpr->getSubExpr() to be null.

Thanks
-- 
Olivier
>From 919a61662f483404b37859f795048bc864c0c7ac Mon Sep 17 00:00:00 2001
From: Olivier Goffart 
Date: Fri, 28 Aug 2015 17:32:55 +0200
Subject: [PATCH] Fix the perentheses location when the constructor is called
 on a class that has a destructor

---
 lib/Sema/SemaCast.cpp |  7 +--
 test/SemaCXX/sourceranges.cpp | 15 ++-
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp
index dea9c22..db276c6 100644
--- a/lib/Sema/SemaCast.cpp
+++ b/lib/Sema/SemaCast.cpp
@@ -2483,8 +2483,11 @@ ExprResult Sema::BuildCXXFunctionalCastExpr(TypeSourceInfo *CastTypeInfo,
   Op.CheckCXXCStyleCast(/*FunctionalStyle=*/true, /*ListInit=*/false);
   if (Op.SrcExpr.isInvalid())
 return ExprError();
-  
-  if (CXXConstructExpr *ConstructExpr = dyn_cast(Op.SrcExpr.get()))
+
+  auto ConstructExpr = dyn_cast(Op.SrcExpr.get());
+  if (auto BindExpr = dyn_cast(Op.SrcExpr.get()))
+ConstructExpr = dyn_cast_or_null(BindExpr->getSubExpr());
+  if (ConstructExpr)
 ConstructExpr->setParenOrBraceRange(SourceRange(LPLoc, RPLoc));
 
   return Op.complete(CXXFunctionalCastExpr::Create(Context, Op.ResultType,
diff --git a/test/SemaCXX/sourceranges.cpp b/test/SemaCXX/sourceranges.cpp
index 9ba003a..8f2cfe5 100644
--- a/test/SemaCXX/sourceranges.cpp
+++ b/test/SemaCXX/sourceranges.cpp
@@ -7,7 +7,7 @@ class P {
 };
 
 namespace foo {
-class A { public: A() {} };
+class A { public: A(int = 0) {} };
 enum B {};
 typedef int C;
 }
@@ -37,3 +37,16 @@ void destruct(foo::A *a1, foo::A *a2, P *p1) {
   // CHECK: MemberExpr {{0x[0-9a-fA-F]+}}  '' ->~P
   p1->~P();
 }
+
+struct D {
+  D(int);
+  ~D();
+};
+
+void construct() {
+  using namespace foo;
+  A a = A(12);
+  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}}  'class foo::A' 'void (int)'
+  D d = D(12);
+  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}}  'struct D' 'void (int)'
+}
-- 
2.5.0

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: r246359 - [AST] Don't crash when comparing incomplete object

2015-08-29 Thread Renato Golin via cfe-commits
On 29 August 2015 at 09:32, David Majnemer via cfe-commits
 wrote:
> Author: majnemer
> Date: Sat Aug 29 03:32:55 2015
> New Revision: 246359
>
> URL: http://llvm.org/viewvc/llvm-project?rev=246359&view=rev
> Log:
> [AST] Don't crash when comparing incomplete object
>
> We cannot tell if an object is past-the-end if its type is incomplete.
> Zero sized objects satisfy past-the-end criteria and our object might
> turn out to be such an object.

Hi David,

With all the bots broken by other reasons, just making sure you're
aware of this:

http://lab.llvm.org:8011/builders/clang-cmake-aarch64-full/builds/96

cheers,
--renato
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r246363 - [X86] Reapplied r246204, r246206, r246211, r246223

2015-08-29 Thread Simon Pilgrim via cfe-commits
Author: rksimon
Date: Sat Aug 29 12:13:40 2015
New Revision: 246363

URL: http://llvm.org/viewvc/llvm-project?rev=246363&view=rev
Log:
[X86] Reapplied r246204, r246206, r246211, r246223

(Re)added debug codegen test for F16C, FMA4, XOP + 3DNow! intrinsics

Part of PR24590

Modified:
cfe/trunk/test/CodeGen/3dnow-builtins.c
cfe/trunk/test/CodeGen/f16c-builtins.c
cfe/trunk/test/CodeGen/fma4-builtins.c
cfe/trunk/test/CodeGen/xop-builtins.c

Modified: cfe/trunk/test/CodeGen/3dnow-builtins.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/3dnow-builtins.c?rev=246363&r1=246362&r2=246363&view=diff
==
--- cfe/trunk/test/CodeGen/3dnow-builtins.c (original)
+++ cfe/trunk/test/CodeGen/3dnow-builtins.c Sat Aug 29 12:13:40 2015
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 %s -O3 -triple=x86_64-unknown-unknown -target-feature 
+3dnow -emit-llvm -o - | FileCheck %s
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 %s -O0 -triple=x86_64-unknown-unknown -target-feature 
+3dnow -emit-llvm -o - -Werror | FileCheck %s
+// RUN: %clang_cc1 %s -O0 -triple=x86_64-unknown-unknown -target-feature 
+3dnow -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM
 
 // Don't include mm_malloc.h, it's system specific.
 #define __MM_MALLOC_H
@@ -8,108 +10,126 @@
 __m64 test_m_pavgusb(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pavgusb
   // CHECK: @llvm.x86.3dnow.pavgusb
+  // CHECK-ASM: pavgusb %mm{{.*}}, %mm{{.*}}
   return _m_pavgusb(m1, m2);
 }
 
 __m64 test_m_pf2id(__m64 m) {
   // CHECK-LABEL: define i64 @test_m_pf2id
   // CHECK: @llvm.x86.3dnow.pf2id
+  // CHECK-ASM: pf2id %mm{{.*}}, %mm{{.*}}
   return _m_pf2id(m);
 }
 
 __m64 test_m_pfacc(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfacc
   // CHECK: @llvm.x86.3dnow.pfacc
+  // CHECK-ASM: pfacc %mm{{.*}}, %mm{{.*}}
   return _m_pfacc(m1, m2);
 }
 
 __m64 test_m_pfadd(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfadd
   // CHECK: @llvm.x86.3dnow.pfadd
+  // CHECK-ASM: pfadd %mm{{.*}}, %mm{{.*}}
   return _m_pfadd(m1, m2);
 }
 
 __m64 test_m_pfcmpeq(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfcmpeq
   // CHECK: @llvm.x86.3dnow.pfcmpeq
+  // CHECK-ASM: pfcmpeq %mm{{.*}}, %mm{{.*}}
   return _m_pfcmpeq(m1, m2);
 }
 
 __m64 test_m_pfcmpge(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfcmpge
   // CHECK: @llvm.x86.3dnow.pfcmpge
+  // CHECK-ASM: pfcmpge %mm{{.*}}, %mm{{.*}}
   return _m_pfcmpge(m1, m2);
 }
 
 __m64 test_m_pfcmpgt(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfcmpgt
   // CHECK: @llvm.x86.3dnow.pfcmpgt
+  // CHECK-ASM: pfcmpgt %mm{{.*}}, %mm{{.*}}
   return _m_pfcmpgt(m1, m2);
 }
 
 __m64 test_m_pfmax(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfmax
   // CHECK: @llvm.x86.3dnow.pfmax
+  // CHECK-ASM: pfmax %mm{{.*}}, %mm{{.*}}
   return _m_pfmax(m1, m2);
 }
 
 __m64 test_m_pfmin(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfmin
   // CHECK: @llvm.x86.3dnow.pfmin
+  // CHECK-ASM: pfmin %mm{{.*}}, %mm{{.*}}
   return _m_pfmin(m1, m2);
 }
 
 __m64 test_m_pfmul(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfmul
   // CHECK: @llvm.x86.3dnow.pfmul
+  // CHECK-ASM: pfmul %mm{{.*}}, %mm{{.*}}
   return _m_pfmul(m1, m2);
 }
 
 __m64 test_m_pfrcp(__m64 m) {
   // CHECK-LABEL: define i64 @test_m_pfrcp
   // CHECK: @llvm.x86.3dnow.pfrcp
+  // CHECK-ASM: pfrcp %mm{{.*}}, %mm{{.*}}
   return _m_pfrcp(m);
 }
 
 __m64 test_m_pfrcpit1(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfrcpit1
   // CHECK: @llvm.x86.3dnow.pfrcpit1
+  // CHECK-ASM: pfrcpit1 %mm{{.*}}, %mm{{.*}}
   return _m_pfrcpit1(m1, m2);
 }
 
 __m64 test_m_pfrcpit2(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfrcpit2
   // CHECK: @llvm.x86.3dnow.pfrcpit2
+  // CHECK-ASM: pfrcpit2 %mm{{.*}}, %mm{{.*}}
   return _m_pfrcpit2(m1, m2);
 }
 
 __m64 test_m_pfrsqrt(__m64 m) {
   // CHECK-LABEL: define i64 @test_m_pfrsqrt
   // CHECK: @llvm.x86.3dnow.pfrsqrt
+  // CHECK-ASM: pfrsqrt %mm{{.*}}, %mm{{.*}}
   return _m_pfrsqrt(m);
 }
 
 __m64 test_m_pfrsqrtit1(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfrsqrtit1
   // CHECK: @llvm.x86.3dnow.pfrsqit1
+  // CHECK-ASM: pfrsqit1 %mm{{.*}}, %mm{{.*}}
   return _m_pfrsqrtit1(m1, m2);
 }
 
 __m64 test_m_pfsub(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfsub
   // CHECK: @llvm.x86.3dnow.pfsub
+  // CHECK-ASM: pfsub %mm{{.*}}, %mm{{.*}}
   return _m_pfsub(m1, m2);
 }
 
 __m64 test_m_pfsubr(__m64 m1, __m64 m2) {
   // CHECK-LABEL: define i64 @test_m_pfsubr
   // CHECK: @llvm.x86.3dnow.pfsubr
+  // CHECK-ASM: pfsubr %mm{{.*}}, %mm{{.*}}
   return _m_pfsubr(m1, m2);
 }
 
 __m64 test_m_pi2fd(__m64 m) {
   // CHECK-LABEL: define i64 @test_m_pi2fd
   // CHECK: @llvm.x86.3dnow.pi2fd
+  // CHECK-ASM: pi2fd %mm{{.*}}, %mm{{.*}}
   return _m_pi2fd(m);
 }
 
@@ -122,35 +142,41 @@ __m64 test_m_pm

Re: [PATCH] D12466: Fix empty -L Path on OSX hosts

2015-08-29 Thread Yaron Keren via cfe-commits
yaron.keren added a comment.

I have never used OSX, Try to add one of the Apple clang developers as 
reviewers, they know more than me about OSX.

My guess there should not be empty paths in  in TC.getFilePaths(). That patch 
seems only to sidestep the issue which will probably surface in other places. 
Can you debug why this empty path is created and fix that?


Repository:
  rL LLVM

http://reviews.llvm.org/D12466



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r246368 - Update for API change in LLVM: ARMTargetParser class is just the ARM

2015-08-29 Thread Chandler Carruth via cfe-commits
Author: chandlerc
Date: Sat Aug 29 21:16:36 2015
New Revision: 246368

URL: http://llvm.org/viewvc/llvm-project?rev=246368&view=rev
Log:
Update for API change in LLVM: ARMTargetParser class is just the ARM
namespace.

Modified:
cfe/trunk/lib/Basic/Targets.cpp
cfe/trunk/lib/Driver/ToolChains.cpp
cfe/trunk/lib/Driver/Tools.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=246368&r1=246367&r2=246368&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Sat Aug 29 21:16:36 2015
@@ -4184,13 +4184,13 @@ class ARMTargetInfo : public TargetInfo
   void setArchInfo() {
 StringRef ArchName = getTriple().getArchName();
 
-ArchISA= llvm::ARMTargetParser::parseArchISA(ArchName);
+ArchISA= llvm::ARM::parseArchISA(ArchName);
 DefaultCPU = getDefaultCPU(ArchName);
 
-unsigned ArchKind = llvm::ARMTargetParser::parseArch(ArchName);
+unsigned ArchKind = llvm::ARM::parseArch(ArchName);
 if (ArchKind == llvm::ARM::AK_INVALID)
   // set arch of the CPU, either provided explicitly or hardcoded default
-  ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
+  ArchKind = llvm::ARM::parseCPUArch(CPU);
 setArchInfo(ArchKind);
   }
 
@@ -4199,9 +4199,9 @@ class ARMTargetInfo : public TargetInfo
 
 // cache TargetParser info
 ArchKind= Kind;
-SubArch = llvm::ARMTargetParser::getSubArch(ArchKind);
-ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch);
-ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch);
+SubArch = llvm::ARM::getSubArch(ArchKind);
+ArchProfile = llvm::ARM::parseArchProfile(SubArch);
+ArchVersion = llvm::ARM::parseArchVersion(SubArch);
 
 // cache CPU related strings
 CPUAttr= getCPUAttr();
@@ -4241,7 +4241,7 @@ class ARMTargetInfo : public TargetInfo
   }
 
   StringRef getDefaultCPU(StringRef ArchName) const {
-const char *DefaultCPU = llvm::ARMTargetParser::getDefaultCPU(ArchName);
+const char *DefaultCPU = llvm::ARM::getDefaultCPU(ArchName);
 return DefaultCPU ? DefaultCPU : "";
   }
 
@@ -4251,7 +4251,7 @@ class ARMTargetInfo : public TargetInfo
 // For Cortex variants, it's slightly different.
 switch(ArchKind) {
 default:
-  CPUAttr = llvm::ARMTargetParser::getCPUAttr(ArchKind);
+  CPUAttr = llvm::ARM::getCPUAttr(ArchKind);
   return CPUAttr ? CPUAttr : "";
 case llvm::ARM::AK_ARMV6M:
 case llvm::ARM::AK_ARMV6SM:
@@ -4501,7 +4501,7 @@ public:
 
   bool setCPU(const std::string &Name) override {
 if (Name != "generic")
-  setArchInfo(llvm::ARMTargetParser::parseCPUArch(Name));
+  setArchInfo(llvm::ARM::parseCPUArch(Name));
 
 if (ArchKind == llvm::ARM::AK_INVALID)
   return false;

Modified: cfe/trunk/lib/Driver/ToolChains.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=246368&r1=246367&r2=246368&view=diff
==
--- cfe/trunk/lib/Driver/ToolChains.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains.cpp Sat Aug 29 21:16:36 2015
@@ -104,10 +104,10 @@ static const char *ArmMachOArchName(Stri
 }
 
 static const char *ArmMachOArchNameCPU(StringRef CPU) {
-  unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
+  unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
   if (ArchKind == llvm::ARM::AK_INVALID)
 return nullptr;
-  StringRef Arch = llvm::ARMTargetParser::getArchName(ArchKind);
+  StringRef Arch = llvm::ARM::getArchName(ArchKind);
 
   // FIXME: Make sure this MachO triple mangling is really necessary.
   // ARMv5* normalises to ARMv5.

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=246368&r1=246367&r2=246368&view=diff
==
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Sat Aug 29 21:16:36 2015
@@ -493,13 +493,13 @@ static bool isNoCommonDefault(const llvm
 // Get SubArch (vN).
 static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
   llvm::StringRef Arch = Triple.getArchName();
-  return llvm::ARMTargetParser::parseArchVersion(Arch);
+  return llvm::ARM::parseArchVersion(Arch);
 }
 
 // True if M-profile.
 static bool isARMMProfile(const llvm::Triple &Triple) {
   llvm::StringRef Arch = Triple.getArchName();
-  unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
+  unsigned Profile = llvm::ARM::parseArchProfile(Arch);
   return Profile == llvm::ARM::PK_M;
 }
 
@@ -528,8 +528,8 @@ static void getARMArchCPUFromArgs(const
 static void getARMHWDivFeatures(const Driver &D, const Arg *A,
 const ArgList &Args, StringRef HWDiv,
 std::vector &

[PATCH] D12471: Correct documentation for numSelectorArgs matcher

2015-08-29 Thread Dave Lee via cfe-commits
kastiglione created this revision.
kastiglione added a reviewer: modocache.
kastiglione added a subscriber: cfe-commits.
Herald added a subscriber: klimek.

Currently, the documentation for `numSelectorArgs` includes an incorrect 
example. It shows a case where an argument of 1 will match a property getter, 
but a getter will be matched only when `N == 0`.

This diff corrects the documentation.

http://reviews.llvm.org/D12471

Files:
  include/clang/ASTMatchers/ASTMatchers.h

Index: include/clang/ASTMatchers/ASTMatchers.h
===
--- include/clang/ASTMatchers/ASTMatchers.h
+++ include/clang/ASTMatchers/ASTMatchers.h
@@ -2139,7 +2139,7 @@
 
 /// \brief Matches when the selector has the specified number of arguments
 ///
-///  matcher = objCMessageExpr(numSelectorArgs(1));
+///  matcher = objCMessageExpr(numSelectorArgs(0));
 ///  matches self.bodyView in the code below
 ///
 ///  matcher = objCMessageExpr(numSelectorArgs(2));


Index: include/clang/ASTMatchers/ASTMatchers.h
===
--- include/clang/ASTMatchers/ASTMatchers.h
+++ include/clang/ASTMatchers/ASTMatchers.h
@@ -2139,7 +2139,7 @@
 
 /// \brief Matches when the selector has the specified number of arguments
 ///
-///  matcher = objCMessageExpr(numSelectorArgs(1));
+///  matcher = objCMessageExpr(numSelectorArgs(0));
 ///  matches self.bodyView in the code below
 ///
 ///  matcher = objCMessageExpr(numSelectorArgs(2));
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits